2012-05-22 3 views
5

Was bedeutet diese Nachricht?Location Manager wurde in einer Dispatch-Warteschlange erstellt

HINWEIS: Ein Standortmanager (0xe86bdf0) wurde in einer Dispatchwarteschlange erstellt, die auf einem anderen Thread als dem Hauptthread ausgeführt wird. Es liegt in der Verantwortung des Entwicklers sicherzustellen, dass eine Ausführungsschleife für den Thread ausgeführt wird, dem das Standortmanagerobjekt zugeordnet ist. Insbesondere wird das Erstellen von Standortmanagern in beliebigen Dispatchwarteschlangen (die nicht an die Hauptwarteschlange angehängt sind) nicht unterstützt und dazu führen, dass keine Rückrufe empfangen werden.

+0

Dank der unten angegebenen Antworten. musste einfach alles in die AppDelegate-Klasse verschieben. – Kassem

Antwort

10

Sie müssen den CLLocationManager für einen Thread mit einer aktiven Ausführungsschleife, z. B. dem Hauptthread, erstellen. Sie sollten es nicht in einem Hintergrundthread erstellen. Siehe CLLocationManager Class Reference für weitere Informationen:

(Konfiguration von Ihrem Standort-Manager-Objekt immer an einem Faden mit einer aktiven Laufschleife auftreten muß, wie Ihr Hauptthread der Anwendung.)

Wenn Sie interessiert sind In was genau eine Laufschleife ist, siehe Run Loops für weitere Informationen.

+0

großartige Erklärung danke :) – Kassem

+0

Soweit Sie wissen, bezieht sich dieses Problem nur auf das GPS? Weil ich mit CMMotionManager (Beschleunigungsmesser, zum Beispiel) dieses Problem nicht sehe. – superpuccio

3

Wenn Sie einen Standortmanager in einem anderen Thread außer dem Hauptthread (dh dem Thread, in dem der gesamte Benutzeroberflächencode für Ihre Anwendung ausgeführt wird) erstellt haben, müssen Sie sicherstellen, dass er immer aufgerufen wird. der Standortmanager) aus dem Thread, der sie erstellt hat.

das Problem in Ihrem Code debuggen, müssen Sie möglicherweise die Schaffung von (und die Anrufe) den Standort-Manager in einer Absende-Warteschlange für den Hauptthread thusly wickeln wollen:

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

und:

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

Oder so etwas zu sehen, wenn die Fehlermeldung verschwindet.

+0

aus irgendeinem Grund blockiert diese Lösung meinen Hauptthread, wenn ich versuche, es zu verwenden. –

+1

Dies war eine Debugging-Lösung - eine Möglichkeit, herauszufinden, was passiert, indem ein Lauf in der Hauptwarteschlange erzwungen wird. Ich denke, Sie haben vielleicht ein rückständiges Verständnis für den Vorschlag. – Sunny

5

Mit Swift 3 wird im Folgenden Ihre Funktion gewährleisten läuft auf Hauptthread:

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

OperationQueue ist eine leistungsstarke Funktion. es funktionierte für mich. –

+0

Dasselbe ist für ObjC verfügbar: '[[NSOperationQueue mainQueue] addOperationWithBlock:^{}]' –

Verwandte Themen