我的应用程序监控用户位置,包括一些后台位置监控。
我的App Delegate里面有一个位置管理器,主要用于初始启动位置和后台更新。然后我在我的视图控制器(地图)内有另一个管理器,用于更多特定事件和快速参考。
我想知道将其重构为一个实例,保存在App Delegate中,并在整个应用程序中使用它来引用是否是一个好的做法。
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
在您的应用程序中的任何地方,通过调用 [MyLocationManager sharedInstance]
.
如果一个惯例阻碍了你的发展,那么就不要使用它。
你要权衡在内存中保留该位置管理器的成本与初始化所需的时间相比。 如果说,每次启动位置管理器都需要一分钟,那么是的,你会希望在某个方便的地方保留一个实例,比如在应用委托中,在其他地方访问它。 同样,如果经理是相当多的即时,但内存昂贵,通常会更好地使和使用它只在需要时。
CLLocationManager
被设计成多个实例工作,所以为你的应用程序中的每个功能创建一个。它们都是轻量级的,所以不用担心创建很多,而且它们都与一个私人位置客户端通信,根据有多少个管理器来启动和停止GPS。
将其重构为一个单一实例,就是在撤销苹果为使其作为多个实例工作所做的所有努力。