2016-07-19 10 views
0

通常、CLLocationを使用してユーザーの場所を取得しようとすると、locationManager.startUpdatingLocations()を使用するとdidUpdateLocationsメソッド(すべてがうまくいけば)が呼び出されます。Swift:手動でCLLocationを呼び出す方法

しかし、私はそれを使って補完ハンドラを使うことができるように、場所を取得する関数を手動で呼び出すことができる必要があります。 didUpdateLocationsメソッドを使用せずに場所を更新した後、ユーザーの場所を取得するにはどうすればよいですか?

+0

私はあなたの質問を理解するとは思わない。どの補完ハンドラについて話していますか? locationManager:didUpdateLocations: 'を使用して、ロケーションマネージャがいつロケーションの更新を完了したかを知る必要があります。 – AdamPro13

答えて

0

CLLocationManagerlocationのプロパティにいつでもアクセスできます。これは、最も最近決定された位置を有する。場所が決まっていない場合は、ゼロになることがあります。

iOS 9 &をターゲットにしている場合は、requestLocationメソッドを使用して1か所の位置情報を要求できます。場所の更新はいつものようにdidUpdateLocationsに届きます。同期/ブロッキングの「要求の場所はありません。それが更新され、私に場所を返します」メソッドがあります。

1

「手動でCLLocationを呼び出す」ことはできません。場所の更新を開始すると、システムはdidUpdateLocationsメソッドの呼び出しを開始します。最初に取得する場所は、精度がかなり悪い可能性があります。良い場所を得るためには、実際に正確さをチェックし、それを受け入れる前に要件を満たす場所を見つけるまで待つ必要があります。

私は新しいrequestLocationメソッドをまだ使用していないため、最初に場所をリクエストしたときに得た悪い結果に関して、どのように機能するのか分かりません。ドキュメントは「位置修正はdesiredAccuracyプロパティで指定された精度レベルで取得されています」と言いますが、startUpdatingLocationsも希望の精度を誇り、最初の数回の読みはstartUpdatingLocations

どちらの場合も、どちらのアプローチもdidUpdateLocationsに結果/結果を呼び出します。

ロケーションを取得した後にクロージャ/補完ハンドラを呼び出す場合は、独自のロケーションマネージャシングルトンを作成することをお勧めします。それをMyLocationManagerとしましょう。

これにメソッドgetLocation(completion:)を付けて、完了ブロックを取ることができます。実装は、場所の更新を開始するか、またはrequestLocationを呼び出します(そのメソッドが最初に信頼性の高い場所を返す場合)。また、(オプションの)インスタンス変数に補完ハンドラクロージャを保存することもありません。 MyLocationManagerのdidUpdateLocationsの実装では、完了ハンドラがあるかどうかをチェックし、見つかった場合はそれを呼び出して、完了ハンドラを終了します。

関連する問題