位置管理器是在调度队列上创建的

时间:2012-05-22 17:29:26

标签: iphone objective-c ios ios5

这条消息是什么意思?

注意,在主线程以外的线程上执行的调度队列上创建了位置管理器(0xe86bdf0)。开发人员有责任确保在分配了位置管理器对象的线程上运行运行循环。特别是,不支持在任意调度队列(未附加到主队列)中创建位置管理器,这将导致无法接收回调。

3 个答案:

答案 0 :(得分:12)

您必须在具有活动运行循环的线程上创建CLLocationManager,例如主线程。您不应该在后台线程上创建它。有关详细信息,请参阅CLLocationManager Class Reference

  

(位置管理器对象的配置必须始终出现在具有活动运行循环的线程上,例如应用程序的主线程。)

如果您对运行循环的确切内容感兴趣,请参阅Run Loops以获取更多信息。

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

这意味着如果你在“主”线程之外​​的另一个线程中创建了一个位置管理器(即你app的所有UI代码都执行的线程),你需要确保始终调用它(即,位置管理器)来自创建它的线程。

要调试代码中的问题,您可能希望将位置管理器的创建(和调用)包装在主线程的调度队列中:

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

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

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