2012-05-22 4 views
5

このメッセージは何を意味していますか?ロケーションマネージャがディスパッチキューに作成されました

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

+0

感謝を。すべてをAppDelegateクラスに移動するだけでした。 – Kassem

答えて

10

メインスレッドなど、アクティブな実行ループを持つスレッドにCLLocationManagerを作成する必要があります。バックグラウンドスレッドで作成しないでください。あなたが興味を持っている場合

(お住まいの地域マネージャオブジェクトの設定は、常に、このようなアプリケーションのメインスレッドのようにアクティブ実行ループ、とのスレッドで発生する必要があります。)

:詳細については、CLLocationManager Class Referenceを参照してください。実行ループが正確に何であるかについては、Run Loopsを参照してください。

+0

偉大な説明ありがとう:) – Kassem

+0

知っている限り、この問題はGPSにのみ関連していますか? CMMotionManager(加速度計など)ではこの問題が表示されないためです。 – superpuccio

3

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

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

と::

はあなたの創造(とへの呼び出し)thuslyメインスレッドのディスパッチキュー内のロケーションマネージャをラップする場合があります、あなたのコードで問題をデバッグするには

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

エラーメッセージが消えるかどうかを確認してください。スウィフト3で

+0

私はそれを使用しようとすると、何らかの理由でこのソリューションが私のメインスレッドをブロックします。 –

+1

これはデバッグの解決策でした。メインキューで実行を強制することで何が起きているのか把握する方法です。私はあなたがその提案を後ろ向きに理解していると思います。 – Sunny

5

は、あなたの機能を確保すれば、以下の通りでは、メインスレッド上で実行されます:以下の答えに

OperationQueue.main.addOperation{"your location manager init code"} 
+0

OperationQueueは強力な機能です。 それは私のために働いた。 –

+0

ObjCでも同じことができます: '[[NSOperationQueue mainQueue] addOperationWithBlock:^ {}]' –

関連する問題