CLLocationManager stopUpdatingLocation不会停止

时间:2016-11-17 22:24:52

标签: ios objective-c cllocationmanager

以下是我的代码的一些片段

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应该处理这个问题。非常感谢任何见解。

谢谢,

1 个答案:

答案 0 :(得分:0)

didUpdateLocations:可以随时调用,因为它具有异步性质optimisations

  

因为返回初始位置可能需要几秒钟   位置管理器通常提供先前缓存的位置   数据立即然后提供更多的最新位置数据   变得可用了。因此,检查一下总是一个好主意   采取任何行动之前任何位置对象的时间戳。如果两者   定位服务同时启用,它们提供事件   使用相同的委托方法集。

实际上,如果您取消注释locationManager = nil;它应该会有所帮助,但如果您想使用checkingForLocation属性,则应该使分配同步。在这种情况下,@synchronized(self)是最简单的方式。