将一个CLLocationManager保留在AppDelegate中是一个好习惯吗?

时间:2013-12-23 20:51:12

标签: ios objective-c cllocationmanager

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

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

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

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

[self.appDelegate.locationManager startUpdatingLocation];

4 个答案:

答案 0 :(得分:5)

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

// 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在您的应用中随处使用[MyLocationManager sharedInstance]

答案 1 :(得分:2)

我认为最好让一个班级按照Single Responsibility Principle来处理位置,以保留SOLID

  

在面向对象编程中,单一责任原则   说每个班级都应该承担一个责任   责任应完全由班级封装。所有的   服务应与该责任保持一致。

答案 2 :(得分:1)

如果约定妨碍你,那就不要使用它。

您想要权衡将位置管理器保留在内存中的成本与初始化所需的时间相比较。如果说,每次它启动位置管理器花了一分钟然后是,你会希望在一个方便的地方保留一个实例,就像在app代理中一样,并在其他地方访问它。同样,如果经理几乎是即时但内存昂贵,那么通常最好只在需要时制作和使用它。

答案 3 :(得分:0)

CLLocationManager设计为可作为多个实例使用,因此请为您的应用程序中的每个功能创建一个。它们都是轻量级的,因此不必担心会创建很多它们,它们都与一个私人位置客户端进行通信,该客户端根据有多少管理者来启动和停止GPS。

将其重构为单个实例将消除Apple为使其成为多个实例而进行的所有辛勤工作。