CLLocationManager stopUpdatingLocation 不会停止
Posted
技术标签:
【中文标题】CLLocationManager stopUpdatingLocation 不会停止【英文标题】:CLLocationManager stopUpdatingLocation doesn't stop 【发布时间】:2016-11-17 22:24:51 【问题描述】:下面是我的代码的一些sn-ps
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 应该解决这个问题。非常感谢任何见解。
谢谢,
【问题讨论】:
你在哪里打电话给[locationManager startUpdatingLocation]; checkingForLocation = YES;
?
@OgreSwamp 我在按下按钮时调用它。为了清楚起见,我在上面添加了 IBAction 方法。
【参考方案1】:
didUpdateLocations:
由于其异步特性和optimisations 可以在任何时候频繁调用:
因为返回初始位置可能需要几秒钟,所以 位置管理器通常提供先前缓存的位置 立即提供数据,然后提供更多最新的位置数据 变得可用。因此,检查 在采取任何行动之前任何位置对象的时间戳。如果两者 定位服务同时启用,它们传递事件 使用相同的委托方法集。
实际上,如果您取消注释 locationManager = nil;
应该会有所帮助,但是如果您想使用您的 checkingForLocation
属性,则应该使分配同步。 @synchronized(self)
在这种情况下是最简单的方法。
【讨论】:
以上是关于CLLocationManager stopUpdatingLocation 不会停止的主要内容,如果未能解决你的问题,请参考以下文章
为啥'CLLocationManager.locationServicesEnabled()'默认为真?
Xcode 6 GM - CLLocationManager
CLLocationManager 和 CLGeoCoder
CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons