11

这个消息是什么意思?

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

4

3 回答 3

15

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

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

如果您对运行循环的确切含义感兴趣,请参阅运行循环了解更多信息。

于 2012-05-22T17:41:04.480 回答
6

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

OperationQueue.main.addOperation{"your location manager init code"}
于 2016-10-19T15:52:35.897 回答
2

这意味着如果您在“主”线程(即应用​​程序的所有 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];
});

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

于 2012-05-22T17:49:32.353 回答