【发布时间】:2013-03-02 11:32:16
【问题描述】:
当应用程序在后台时,我启用了位置服务来更新位置,当应用程序在前台显示地图时,我也会监听位置更新。在 iOS 中设计这种场景的最佳方式应该是什么?我已经考虑了一些选择:
1) 有一个类的实例,该类的 locationManager 成员是其委托本身。然后,在 didUpdateToLocation 委托方法的主体中,类似于:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if (!background) {
// Perform some processing and notify the view controller which displays the map
// by means of Notification Center
}
else {
appDelegate.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:appDelegate.bgTask];
appDelegate.bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Perform some data processing
// Close background task
if (appDelegate.bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:appDelegate.bgTask];
appDelegate.bgTask = UIBackgroundTaskInvalid;
}
});
}
}
(注意:我不确定是否将位置服务启用为后台服务,是否需要执行位置处理,就好像它是一个有限的后台任务......)。此类的实例可以是AppDelegate 的成员,并在进入后台或从显示地图的viewModel 调用实例时开始侦听位置。因此,AppDelegate 将引用管理locationManager 的实例,而地图视图控制器将引用AppDelegate,或者也通过通知中心进行通信。
2) 直接在AppDelegate 中拥有locationManager 成员,并作为代表本身。
将de location监听和管理封装在不同的类中,还是直接在AppDelegate中处理会更好吗?考虑到我必须能够在前台和后台监听位置并执行一些任务。
提前致谢
【问题讨论】:
标签: ios background core-location cllocationmanager foreground