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

dar*_*elt 2 objective-c cllocationmanager ios

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

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

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

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

[self.appDelegate.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)

Joh*_*rug 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以MyLocationManager通过拨打电话在应用中的任意位置使用[MyLocationManager sharedInstance].

  • 我终于在本周末重构了我的代码并实现了单例"LocationController".太棒了 - 非常感谢. (2认同)