Objective c 如何在同步中获取位置管理器的共享实例

Objective c 如何在同步中获取位置管理器的共享实例,objective-c,cllocationmanager,synchronized,locationmanager,background-task,Objective C,Cllocationmanager,Synchronized,Locationmanager,Background Task,Hy,我想获得后台位置更新,所以我编写了下面的代码,并使其同步,以防止多线程处理。所以我有两个问题: 我真的需要同步这段代码吗,我在应用程序中所做的只是运行后台任务?我从来没有创建任何特殊的NSThread类型来支持多线程,也不需要这样做 每当我需要启动位置更新时,我都会这样调用: CLLocationManager *locationManager = [LocationTracker sharedLocationManager]; locationManager.delegate = se

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

共享实例应同步。您可以使用
@Synchronized
一次调度
。即使不使用多线程,也最好同步共享实例

+ (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
类中实现location manager委托。使用
NSNotificationObserver
更新所有需要位置更新的类

否则,请按照下面的行操作

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

是的,我在位置跟踪器中实现了代理。我还有一个疑问,它是否会绕过初始化代码“dispatch_once(&onceToken,^{sharedInstance_u=[[LocationTracker alloc]init];[sharedInstance_uinitialize];});”如果我第二次调用[LocationTracker sharedLocationManager],dispatch\u once块将只执行一次。因此,即使您多次调用[LocationTracker sharedLocationManager]。初始化只会发生一次。在同步的情况下会发生什么?同步将确保一次只有一个线程访问您的代码块。在一个块内,您正在检查(_locationManager==nil)这是否会第二次失败,因为_locationManager是静态变量。第二次调用sharedLocationManager方法时,_locationManager作为静态变量是否会携带所有属性?比如期望的准确度等?