2012-05-22 16 views
5

¿Qué significa este mensaje?Administrador de ubicación se creó en una cola de envío

AVISO, se creó un administrador de ubicación (0xe86bdf0) en una cola de distribución ejecutándose en un hilo que no sea el hilo principal. Es responsabilidad del desarrollador asegurarse de que haya un bucle de ejecución ejecutándose en el hilo en el que se asigna el objeto del administrador de la ubicación. En particular, la creación de administradores de ubicación en colas de despacho arbitrarias (no asociadas a la cola principal) no es compatible y dará como resultado que no se reciban las devoluciones de llamada.

+0

Gracias a las respuestas a continuación. solo tuve que mover todo a la clase AppDelegate. – Kassem

Respuesta

10

Debe crear el CLLocationManager en una secuencia con un ciclo de ejecución activo, como el hilo principal. No deberías crearlo en un hilo de fondo. Ver CLLocationManager Class Reference para más información:

(Configuración de su ubicación administrador de objetos siempre debe ocurrir en un hilo con un bucle de ejecución activo, como hilo principal de la aplicación.)

Si está interesado en qué es exactamente un ciclo de ejecución, vea Run Loops para obtener más información.

+0

gran explicación gracias :) – Kassem

+0

Por lo que usted sabe, ¿este problema está relacionado solo con el GPS? Porque con CMMotionManager (acelerómetro, por ejemplo) no veo este problema. – superpuccio

3

Significa que si creó un administrador de ubicación en otro hilo además del hilo "Principal" (es decir, el hilo donde se ejecuta todo el código de UI para su aplicación), debe asegurarse de llamarlo siempre (es decir, el administrador de la ubicación) del hilo que lo creó.

para depurar el problema en su código, es posible que desee para envolver la creación de (y las llamadas a) el gestor de ubicación dentro de una cola de distribución para el hilo principal de esta manera:

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

y:

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

O algo así para ver si el mensaje de error desaparece.

+0

por alguna razón esta solución bloquea mi hilo principal cuando intento usarlo. –

+1

Esta era una solución de depuración, una forma de descubrir qué está pasando forzando una ejecución en la cola principal. Creo que podrías tener una comprensión hacia atrás de la sugerencia. – Sunny

5

Con Swift 3, la siguiente se asegurará que su función se ejecuta en el hilo principal:

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

OperationQueue es una característica poderosa. funcionó para mí. –

+0

Lo mismo está disponible para ObjC: '[[NSOperationQueue mainQueue] addOperationWithBlock:^{}]' –

Cuestiones relacionadas