Как получить общий экземпляр менеджера местоположения в синхронизации

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];
Другие вопросы по тегам