位置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]; });
或者类似的东西,看看错误消息是否消失。