11

このメッセージはどういう意味ですか?

注意、ロケーション マネージャ (0xe86bdf0) が、メイン スレッド以外のスレッドで実行されているディスパッチ キューに作成されました。ロケーションマネージャーオブジェクトが割り当てられているスレッドで実行ループが実行されていることを確認するのは、開発者の責任です。特に、任意のディスパッチ キュー (メイン キューにアタッチされていない) でのロケーション マネージャーの作成はサポートされておらず、コールバックが受信されません。

4

3 に答える 3

15

メインスレッドなど、実行ループがアクティブなスレッドで CLLocationManager を作成する必要があります。バックグラウンド スレッドで作成しないでください。詳細については、 CLLocationManager クラス リファレンスを参照してください。

(ロケーション マネージャー オブジェクトの構成は、アプリケーションのメイン スレッドなど、実行ループがアクティブなスレッドで常に行う必要があります。)

実行ループが正確に何であるかに興味がある場合は、詳細について実行ループを参照してください。

于 2012-05-22T17:41:04.480 に答える
6

Swift 3 では、次のようにして、関数がメイン スレッドで実行されるようにします。

OperationQueue.main.addOperation{"your location manager init code"}
于 2016-10-19T15:52:35.897 に答える
2

つまり、「メイン」スレッド(つまり、アプリのすべてのUIコードが実行されるスレッド)以外の別のスレッドでロケーションマネージャーを作成した場合は、必ずそれを呼び出す必要があります(つまり、ロケーションマネージャー)。それを作成したスレッドから。

コードの問題をデバッグするには、ロケーションマネージャーの作成(およびその呼び出し)をメインスレッドのディスパッチキュー内にラップすることをお勧めします。

dispatch_sync(dispatch_get_main_queue(),^ {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
});

と:

dispatch_sync(dispatch_get_main_queue(),^ {
  [self.locationManager startUpdatingLocation];
});

または、そのようなもので、エラーメッセージが消えるかどうかを確認します。

于 2012-05-22T17:49:32.353 に答える