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

问题描述 投票:2回答:4

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

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

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

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

[self.appDelegate.locationManager startUpdatingLocation];
ios objective-c cllocationmanager
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 在您的应用程序中的任何地方,通过调用 [MyLocationManager sharedInstance].


2
投票

我认为最好是用一个班级来处理这些地点,遵循 单一责任原则,以保持事情 固体:

在面向对象的程序设计中,单一责任原则指出,每个类都应该有一个单一的责任,而且这个责任应该完全由类来封装。它的所有服务都应该与这个责任狭义地结合起来。


1
投票

如果一个惯例阻碍了你的发展,那么就不要使用它。

你要权衡在内存中保留该位置管理器的成本与初始化所需的时间相比。 如果说,每次启动位置管理器都需要一分钟,那么是的,你会希望在某个方便的地方保留一个实例,比如在应用委托中,在其他地方访问它。 同样,如果经理是相当多的即时,但内存昂贵,通常会更好地使和使用它只在需要时。


0
投票

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

将其重构为一个单一实例,就是在撤销苹果为使其作为多个实例工作所做的所有努力。

© www.soinside.com 2019 - 2024. All rights reserved.