2

Hy, ich möchte die Hintergrund-Location-Updates, also schrieb ich den untenstehenden Code und machen es synchronisiert, um es vor Multithreading zu schützen. So habe ich zwei Fragen:Wie bekomme ich eine gemeinsame Instanz von Location Manager in synchronisieren

  • Benötige ich wirklich das Stück Code zu synchronisieren, alles, was ich in App tue, ist nur Hintergrund-Task ausgeführt wird? Ich habe nie einen speziellen NSThread Typ erstellt, um Multithreading zu unterstützen und nicht als solches zu benötigen?

  • Jedes Mal, wenn ich brauche, um die Standortaktualisierungen zu starten, ich so nennen:

    CLLocationManager *locationManager = [LocationTracker sharedLocationManager]; 
    locationManager.delegate = self; 
    [locationManager startUpdatingLocation]; 
    

    richtige Weg ist, zu nennen?

    + (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; 
    } 
    

Antwort

1

Gemeinsame Instanz sollte synchronisiert werden. Sie können @Synchronized oder dispatch_once verwenden. Es empfiehlt sich, die freigegebenen Instanzen zu synchronisieren, auch wenn Sie nicht mehrere Threads verwenden.

+ (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; 
     } 
} 

Sie können die Aufnahmeleiter Delegierten innerhalb der LocationTracker Klasse implementieren. Verwenden Sie NSNotificationObserver, um alle Klassen zu aktualisieren, die alle eine Standortaktualisierung erwarten.

Andernfalls folgen Sie der unten stehenden Zeile.

CLLocationManager *locationManager = [LocationTracker sharedLocationManager].locationManager; 
locationManager.delegate = self; 
[locationManager startUpdatingLocation]; 
+0

ja, ich habe die Delegierten in Location Tracker implementiert. Ich habe noch einen Zweifel wird es umgehen den Initialisierungscode 'dispatch_once (& onceToken,^{ sharedInstance_ = [[LocationTracker Alloc] init]; [sharedInstance_ initialize]; });' wenn ich [LocationTracker sharedLocationManager] das zweite Mal anrufe. – Ketan

+0

dispatch_once Block wird nur einmal ausgeführt. So rufen Sie selbst mehrere Zeitpunkte von [LocationTracker sharedLocationManager] an. Initialisierung wird nur einmal passieren – Subramanian

+0

was wird im Falle von synchronisiert werden? – Ketan

Verwandte Themen