このメッセージはどういう意味ですか?
注意、ロケーション マネージャ (0xe86bdf0) が、メイン スレッド以外のスレッドで実行されているディスパッチ キューに作成されました。ロケーションマネージャーオブジェクトが割り当てられているスレッドで実行ループが実行されていることを確認するのは、開発者の責任です。特に、任意のディスパッチ キュー (メイン キューにアタッチされていない) でのロケーション マネージャーの作成はサポートされておらず、コールバックが受信されません。
このメッセージはどういう意味ですか?
注意、ロケーション マネージャ (0xe86bdf0) が、メイン スレッド以外のスレッドで実行されているディスパッチ キューに作成されました。ロケーションマネージャーオブジェクトが割り当てられているスレッドで実行ループが実行されていることを確認するのは、開発者の責任です。特に、任意のディスパッチ キュー (メイン キューにアタッチされていない) でのロケーション マネージャーの作成はサポートされておらず、コールバックが受信されません。
メインスレッドなど、実行ループがアクティブなスレッドで CLLocationManager を作成する必要があります。バックグラウンド スレッドで作成しないでください。詳細については、 CLLocationManager クラス リファレンスを参照してください。
(ロケーション マネージャー オブジェクトの構成は、アプリケーションのメイン スレッドなど、実行ループがアクティブなスレッドで常に行う必要があります。)
実行ループが正確に何であるかに興味がある場合は、詳細について実行ループを参照してください。
Swift 3 では、次のようにして、関数がメイン スレッドで実行されるようにします。
OperationQueue.main.addOperation{"your location manager init code"}
つまり、「メイン」スレッド(つまり、アプリのすべての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];
});
または、そのようなもので、エラーメッセージが消えるかどうかを確認します。