当应用程序在后台时,我启用了位置服务以更新位置,并且当应用程序在前台显示地图时,我还收听位置更新。在 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
,并且地图 viewController 将引用AppDelegate
,或者也通过通知中心进行通信。
2) 让locationManager
成员直接在 中AppDelegate
,并作为代表本身。
将位置监听和管理封装在不同的类中,还是直接在 中处理会更好AppDelegate
吗?考虑到我必须能够在前台和后台监听位置并执行一些任务。
提前致谢