Ios 在我的AppDelegate中保留一个CLLocationManager是一种好做法吗?

Ios 在我的AppDelegate中保留一个CLLocationManager是一种好做法吗?,ios,objective-c,cllocationmanager,Ios,Objective C,Cllocationmanager,我的应用程序监视用户位置,包括一些后台位置监视 我的应用程序代理中有一个位置管理器,主要用于初始启动位置和后台更新。然后,我的视图控制器(map)中有另一个管理器,用于更具体的事件和快速参考 我想知道将其重构为一个实例(保留在应用程序中)并在整个应用程序中使用以下方法引用是否是一种好的做法: self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; [self.appDelegate.loca

我的应用程序监视用户位置,包括一些后台位置监视

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

我想知道将其重构为一个实例(保留在应用程序中)并在整个应用程序中使用以下方法引用是否是一种好的做法:

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

[self.appDelegate.locationManager startUpdatingLocation];

我认为最好有一个类来处理位置,遵循以下规则来保存东西:

在面向对象编程中,单一责任原则 声明每个阶级都应该有一个单一的责任 责任应该完全由班级承担。全部 服务应与这一责任紧密结合


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

// 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
,如果约定妨碍了您,请不要使用它


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

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


将其重构为一个实例将使苹果为使其作为多个实例工作所做的所有努力付诸东流。

有很多方法,但应用程序委托是合理的。或者,您也可以在自己的类中有一个singleton(通过属性公开的静态CLLocationManager对象)。应该告诉它要显示哪些数据,它的逻辑应该都与用户如何查看数据以及如何与数据交互有关。它不应该负责从web服务器或CLLocationManager获取数据。因此,除非你的应用程序非常简单,否则CLLocationManager既不属于你的应用程序委托,也不属于你的视图控制器。我终于在这个周末重构了我的代码,并实现了一个单例“LocationController”。太棒了-非常感谢。不,苹果在让CLLocationManager工作上花了很多功夫,因为多个实例并不能用单个实例撤销这一点。为每个目的创建一个不同的经理。@malhal:是的,在工作中使用正确的工具是非常重要的,这是绝对的!在某些应用程序中,你可能只是为了一个单一的目的而使用一个位置管理器,然后-imho-使用一个单例就可以了。