Как получить общий экземпляр менеджера местоположения в синхронизации
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; }
1 ответ
Общий экземпляр должен быть синхронизирован. Ты можешь использовать @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];