以下是我的代码的一些片段
BOOL checkingForLocation;
.
.
.
- (IBAction)LocationButtonTapped:(id)sender {
[locationManager startUpdatingLocation];
checkingForLocation = YES;
}
.
.
.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
[locationManager stopUpdatingLocation];
// locationManager = nil;
if (checkingForLocation) {
checkingForLocation = NO;
NSLog(@"here");
// fetch data from server using location and present view controllers
}
}
didUpdateLocations被多次调用,因为locationManager不断更新每个startUpdatingLocation的位置。我的应用程序有一个错误,if(checkingForLocation)
中的代码多次运行并多次渲染视图会导致意外结果。
1)为什么stopUpdatingLocation不会停止对didUpdateLocations的进一步调用?
2)此外,如果checkingForLocation
已设置为NO
,为什么后续调用didUpdateLocations仍将checkingForLocation
视为YES
。那里有竞争条件吗?
通过搜索其他SO问题,我发现设置locationManager = nil
将停止对didUpdateLocations的额外调用,它确实解决了我的问题,但没有真正的解释。似乎stopUpdatingLocation应该处理这个问题。非常感谢任何见解。
谢谢,
答案 0 :(得分:0)
didUpdateLocations:
可以随时调用,因为它具有异步性质optimisations:
因为返回初始位置可能需要几秒钟 位置管理器通常提供先前缓存的位置 数据立即然后提供更多的最新位置数据 变得可用了。因此,检查一下总是一个好主意 采取任何行动之前任何位置对象的时间戳。如果两者 定位服务同时启用,它们提供事件 使用相同的委托方法集。
实际上,如果您取消注释locationManager = nil;
它应该会有所帮助,但如果您想使用checkingForLocation
属性,则应该使分配同步。在这种情况下,@synchronized(self)
是最简单的方式。