2012-05-22 16 views
5

cosa significa questo messaggio?location manager è stato creato su una coda di spedizione

AVVISO, un gestore località (0xe86bdf0) è stato creato su una coda di invio in esecuzione su un thread diverso dal thread principale. È responsabilità dello sviluppatore assicurarsi che esista un ciclo di esecuzione in esecuzione sul thread su cui è allocato l'oggetto gestore posizioni. In particolare, la creazione di gestori di località in code di invio arbitrarie (non collegate alla coda principale) non è supportata e comporterà la mancata ricezione di callback.

+0

Grazie alle risposte qui sotto. dovevo semplicemente spostare tutto nella classe AppDelegate. – Kassem

risposta

10

È necessario creare CLLocationManager su un thread con un ciclo di esecuzione attivo, ad esempio il thread principale. Non dovresti crearlo su un thread in background. Vedere CLLocationManager Class Reference per ulteriori informazioni:

(configurazione della vostra location manager oggetto deve sempre avvenire su un thread con un ciclo di esecuzione attivo, come thread principale dell'applicazione.)

Se siete interessati in che cosa esattamente un ciclo di corsa è, vedere Run Loops per ulteriori informazioni.

+0

ottima spiegazione grazie :) – Kassem

+0

Per quanto ne sai, questo problema è legato solo al GPS? Perché con CMMotionManager (accelerometro, per esempio) non vedo questo problema. – superpuccio

3

Significa che se hai creato un gestore località in un altro thread oltre al thread "Main" (cioè, il thread in cui viene eseguito tutto il codice UI per l'app), devi assicurarti di chiamarlo sempre (es. il responsabile della posizione) dal thread che lo ha creato.

per il debug del problema nel codice, si potrebbe desiderare di avvolgere la creazione di (e le chiamate a) il manager posizione all'interno di una coda di invio per il thread principale così:

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

e:

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

Oppure qualcosa del genere per vedere se il messaggio di errore scompare.

+0

per qualche motivo questa soluzione blocca il mio thread principale quando provo ad usarlo. –

+1

Questa era una soluzione di debug - un modo per capire cosa sta succedendo forzando una corsa sulla coda principale. Penso che potresti avere una comprensione arretrata del suggerimento. – Sunny

5

Con Swift 3, il seguente garantirà la funzione gira su thread principale:

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

OperationQueue è una funzionalità potente. ha funzionato per me. –

+0

Lo stesso è disponibile per ObjC: '[[NSOperationQueue mainQueue] addOperationWithBlock:^{}]' –

Problemi correlati