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