【问题标题】:Is it a good practice to keep one CLLocationManager inside my AppDelegate?在我的 AppDelegate 中保留一个 CLLocationManager 是一种好习惯吗?
【发布时间】:2013-12-23 20:51:11
【问题描述】:

我的应用监控用户位置,包括一些后台位置监控。

我的 App Delegate 中有一个位置管理器,主要用于初始启动位置以及后台更新。然后我的视图控制器(地图)中有另一个管理器,用于更具体的事件和快速参考。

我想知道将其重构为一个实例,保存在 App Delegate 中,并在整个应用程序中使用以下方法引用它是否是一种好习惯:

self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self.appDelegate.locationManager startUpdatingLocation];

【问题讨论】:

  • 方法有很多,但是appdelegate是合理的。或者,您也可以在其自己的类中拥有一个单例 - 通过属性公开的静态 CLLocationManager 对象。
  • 遵循 MVC,您的视图控制器应该……控制您的视图。应该告诉要显示什么数据,并且它的逻辑都应该与用户如何查看数据以及如何与数据交互相关。它应该负责从 Web 服务器或 CLLocationManager 获取数据。因此,除非您的应用非常简单,否则 CLLoctionManager 既不属于您的应用委托也不属于您的视图控制器。

标签: ios objective-c cllocationmanager


【解决方案1】:

为了扩展其他评论者的建议,我还建议将其放入自己的类中,如下所示:

// Header
@interface MyLocationManager : NSObject
+ (MyLocationManager *)sharedInstance;
@property (readonly) CLLocationManager *locationManager;
@end


// Implementation
@implementation MyLocationManager
- (id)init
{
    self = [super init];

    if (self) {
        _locationManager = /* set up your location manager */;
    }

    return self;
}

+ (MyLocationManager *)sharedInstance
{
    static MyLocationManager *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyLocationManager alloc] init];
    });
    return sharedInstance;
}
@end

然后,您可以通过调用[MyLocationManager sharedInstance],在应用中的任何位置使用您的MyLocationManager

【讨论】:

  • 我终于在这个周末重构了我的代码并实现了一个单例“LocationController”。太棒了 - 非常感谢。
  • 不,Apple 为使 CLLocationManager 工作而付出了很多努力,因为多个实例无法通过单例撤消它。为每个目的创建不同的经理。
  • @malhal:是的,使用正确的工具来完成这项工作非常重要,绝对!在某些应用程序中,您可能只有一个使用位置管理器的目的,然后 - 恕我直言 - 使用单例就很好。
【解决方案2】:

我认为最好有一个类来处理位置,遵循Single Responsibility Principle,保留SOLID

在面向对象编程中,单一职责原则 声明每个类都应该有一个单一的责任,并且 责任应该完全由类封装。它的所有 服务应与该职责紧密结合。

【讨论】:

    【解决方案3】:

    如果约定妨碍您,请不要使用它。

    您想要权衡将该位置管理器保留在内存中的成本与初始化所需的时间。如果说,每次启动位置管理器都需要一分钟,那么是的,您可能希望将一个实例保存在方便的地方,例如在应用程序委托中并在其他地方访问它。同样,如果管理器几乎是即时的,但内存很昂贵,通常最好只在需要时制作和使用它。

    【讨论】:

      【解决方案4】:

      CLLocationManager 旨在作为多个实例工作,因此为您应用中的每个功能创建一个。它们都是轻量级的,因此不必担心创建大量它们,它们都与一个私人位置客户端通信,该客户端根据管理器的数量启动和停止 GPS。

      将其重构为单个实例正在取消 Apple 为使其作为多个实例工作而付出的所有努力。

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 2012-12-24
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多