位置pipe理器是在调度队列上创build的

这个消息是什么意思?

注意,位置pipe理器(0xe86bdf0)是在主线程以外的线程上执行的调度队列上创build的。 确保在分配了位置pipe理器对象的线程上运行的运行循环是开发人员的责任。 尤其是,在任意调度队列(不附加到主队列)中创build位置pipe理器不受支持,并且会导致未收到callback。

您必须在具有活动运行循环的线程(例如主线程)上创buildCLLocationManager。 你不应该在后台线程上创build它。 有关更多信息,请参阅CLLocationManager类参考 :

(您的位置pipe理器对象的configuration必须始终发生在具有活动运行循环的线程上,例如应用程序的主线程。)

如果您对什么是运行循环感兴趣,请参阅运行循环了解更多信息。

使用Swift 3,以下内容将确保您的函数在主线程上运行:

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

这意味着,如果您在除“主”线程之外​​的另一个线程中创build位置pipe理器(即执行所有UI代码的线程执行),则需要确保始终调用它(即位置pipe理器)从创build它的线程。

为了在你的代码中debugging这个问题,你可能想要在主线程的调度队列中创build(和调用)位置pipe理器:

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

和:

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

或者类似的东西,看看错误消息是否消失。