【问题标题】:Location-aware iOS app with background support design issue具有后台支持设计问题的位置感知 iOS 应用
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。由于我还需要在应用进入后台时获取位置更新,所以将单例实例放在AppDelegate 中,然后在需要时从相应的UIViewController 访问它不是更好吗?另一方面,拥有一个“BaseViewController”可能是个好主意
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!到目前为止,我一直在使用 NSNotificationCenter 但不是 KVO ......看起来 KVO 或多或少是相同的,为什么它应该更好?
    • 看看下面的内容,它很好地概述了委托、通知和 KVO。它缺少块模式,但仍然很好:blog.shinetech.com/2011/06/14/…
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多