Objective c 如何在同步中获取位置管理器的共享实例
Hy,我想获得后台位置更新,所以我编写了下面的代码,并使其同步,以防止多线程处理。所以我有两个问题: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
- 我真的需要同步这段代码吗,我在应用程序中所做的只是运行后台任务?我从来没有创建任何特殊的
类型来支持多线程,也不需要这样做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作为静态变量是否会携带所有属性?比如期望的准确度等?