我有一个方法(methodA)在应用程序使用UIApplicationWillEnterForegroundNotification
进入前台时执行,然后调用这些方法我调用CLLocationManager
' startUpdatingLocation
方法,我希望methodA被执行只有当startUpdatingLocation
完成时,我才会这样做:
- (void)applicationEnteredForeground:(NSNotification *)notification {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[self.manager startUpdatingLocation];
});
dispatch_group_notify(group, queue, ^{
[self methodA];
});
}
问题是methodA
在startUpdatingLocation
完成之前仍然调用,有关如何做到的任何想法吗?
答案 0 :(得分:0)
当您调用startUpdatingLocation时,您的locationManager启动(并且不停止)以接收新位置。如果你想在有位置时做点什么,你应该实现locationManagerDelegate,(抱歉我没有我的电脑,我通过内存说话)和方法locationManager:didReceiveLocations,(或类似的东西)。
答案 1 :(得分:0)
简短的回答是:你没有。这不是位置管理器和其他异步iOS框架的设计方式。
正如Onik所说,您应该将对象(通常是视图控制器)设置为位置管理器的委托。
在CLLocationManagerDelegate
的Xcode帮助中搜索。具体来说,您需要locationManager:didUpdateLocations:
方法。
当您这样做时,当位置更新可用时,将调用locationManager:didUpdateLocations:
方法。然后,您需要检查位置更新以确保它不旧,并确保准确性值是可接受的。 (从位置管理器获得的第一个读数可能是上次GPS处于活动状态时读取的非常旧的缓存位置。之后,前几个更新可能具有非常差的准确度值。可能需要10秒或更长时间才能完成GPS定居并开始给出合理的读数,有时它永远不会(特别是在室内)。