2

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

共享实例应该是同步的。您可以使用@Synchronizeddispatch_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]; 
+0

是的,我实现了位置跟踪器内的代表。我有一个疑问是否会绕过初始化代码'dispatch_once(&onceToken,^ {[LocationTracker alloc] init]; [sharedInstance_ initialize]; });'如果我第二次调用[LocationTracker sharedLocationManager]。 – Ketan

+0

dispatch_once块只会执行一次。所以,即使你是多次调用[LocationTracker sharedLocationManager]。初始化只会发生一次 – Subramanian

+0

在同步的情况下将会发生什么? – Ketan

相关问题