0

当应用程序在后台时,我启用了位置服务以更新位置,并且当应用程序在前台显示地图时,我还收听位置更新。在 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吗?考虑到我必须能够在前台和后台监听位置并执行一些任务。

提前致谢

4

2 回答 2

2

我认为您最好的策略是拥有一个作为locationManager委托的类的单例实例。该实例将负责过滤返回的任何内容,locationManager并最终将位置分配给它的一个属性,我们称之为myLoc

这解决了您在获取位置后需要进行后处理的集中逻辑问题。

其次,为了UIViewControllers在位置更新时得到正确的和其他类实例来做他们需要做的事情,我建议你在myLoc. 我假设你知道它是如何工作的。我建议 KVO 的原因是你需要根据被更改的位置来触发代码的多个区域的更改,而 KVO 就是为这种模式而制作的。

于 2013-03-14T08:27:38.073 回答
0

我想通过说您可以创建一个来向@Rikkles 回答添加更多内容BaseViewController,它是一个子类,UIViewController并且也具有您的单例 locationManager 类的实例。这种方法允许我们将所有冗余代码,如检查可达性、显示活动指示器、获取用户位置等移动到一个地方,并且将可供所有其他实现它的类使用。

于 2013-03-15T12:29:59.947 回答