如何在同步中获取位置管理器的共享实例
问题描述:
Hy,我想获取后台位置更新,因此我编写了下面的代码并使其同步,以确保它不受多线程的影响。所以,我有两个问题:如何在同步中获取位置管理器的共享实例
我真的需要一段代码同步,所有我在做的应用才刚刚运行的后台任务吗?我从来没有创建任何特殊的
NSThread
类型来支持多线程,并且不需要这样做?-
每当我需要启动位置更新,我把这样的:
CLLocationManager *locationManager = [LocationTracker sharedLocationManager]; locationManager.delegate = self; [locationManager startUpdatingLocation];
是调用正确的方法是什么?
+ (CLLocationManager *)sharedLocationManager { static CLLocationManager *_locationManager; @synchronized(self) { if (_locationManager == nil) { _locationManager = [[CLLocationManager alloc] init]; _locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; [_locationManager requestAlwaysAuthorization]; _locationManager.distanceFilter = 10; if(IS_OS_9_OR_LATER){ _locationManager.allowsBackgroundLocationUpdates = YES; } } } return _locationManager; }
答
共享实例应该是同步的。您可以使用@Synchronized
或dispatch_once
。即使您没有使用多个线程,同步共享实例也是很好的做法。
+ (instancetype)sharedLocationManager {
static LocationTracker *sharedInstance_ = NULL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance_ = [[LocationTracker alloc] init];
[sharedInstance_ initialize];
});
return sharedInstance_;
}
- (void)initialize {
_locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
[_locationManager requestAlwaysAuthorization];
_locationManager.distanceFilter = 10;
if(IS_OS_9_OR_LATER){
_locationManager.allowsBackgroundLocationUpdates = YES;
}
}
您可以在LocationTracker
类中实现位置管理器代表。使用NSNotificationObserver
来更新所有期望更新位置的类。
否则按照下面的方法。
CLLocationManager *locationManager = [LocationTracker sharedLocationManager].locationManager;
locationManager.delegate = self;
[locationManager startUpdatingLocation];
是的,我实现了位置跟踪器内的代表。我有一个疑问是否会绕过初始化代码'dispatch_once(&onceToken,^ {[LocationTracker alloc] init]; [sharedInstance_ initialize]; });'如果我第二次调用[LocationTracker sharedLocationManager]。 – Ketan
dispatch_once块只会执行一次。所以,即使你是多次调用[LocationTracker sharedLocationManager]。初始化只会发生一次 – Subramanian
在同步的情况下将会发生什么? – Ketan