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

3

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

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

我想知道将其重构为一个实例,保存在App Delegate中,并在整个应用程序中使用它是否是一个好的做法,如下所示:

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

[self.appDelegate.locationManager startUpdatingLocation];

有很多方法可以实现,但是应用程序委托是比较合理的选择。或者你也可以在自己的类中使用单例 - 通过属性公开的静态CLLocationManager对象。 - EricS
1
按照MVC的设计模式,你的视图控制器应该控制你的视图。它应该被“告知”要显示哪些数据,并且它的逻辑都应该与用户如何查看和交互数据有关。它不应该负责获取数据,无论是从Web服务器还是CLLocationManager。因此,除非你的应用程序非常简单,否则CLLocationManager既不属于你的应用程序委托,也不属于你的视图控制器。 - Aaron Brager
4个回答

4

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

// 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


2
我终于在这个周末重构了我的代码,并实现了一个单例的“LocationController”。太棒了 - 非常感谢。 - darkheartfelt
不要使用单例模式来管理CLLocationManager,因为苹果公司已经花费了大量精力使其能够作为多个实例工作。为每个目的创建一个不同的管理器。 - malhal
@malhal:是的,使用正确的工具非常重要!在某些应用程序中,您可能只需要使用位置管理器的单个目的,那么使用单例模式就可以了。 - Johannes Fahrenkrug

3
我认为最好有一个类来处理位置,遵循单一职责原则,以保持SOLID
在面向对象编程中,单一职责原则指出每个类应该只有一个职责,并且该职责应完全封装在类中。所有服务都应与该职责紧密对齐。

1
如果某个约定妨碍了你的工作,那就不要使用它。
您需要权衡将位置管理器保留在内存中的成本与初始化所需时间之间的差异。例如,如果每次启动位置管理器需要一分钟,那么是的,您需要在方便的地方(例如应用程序委托)保留一个实例,并在其他地方访问它。同样,如果管理器几乎是即时的但占用内存很多,通常最好仅在需要时创建和使用它。

0

CLLocationManager被设计为可以作为多个实例一起工作,因此在您的应用程序中为每个功能创建一个实例。它们都很轻量级,所以不必担心创建多个实例,它们都与一个私有位置客户端通信,该客户端根据经理的数量开始和停止GPS。

将其重构为单个实例将撤消苹果为使其作为多个实例而努力所做的所有工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接