didUpdateToLocations:永不结束?
基于另一个SO问题,我已经实现了didUpdateLocations:
方法如下:didUpdateToLocations:永不结束?
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// Get the latest location found
CLLocation *location = [locations lastObject];
NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) return;
if (location.horizontalAccuracy < 0) return;
if (_bestEffort == nil || _bestEffort.horizontalAccuracy >= location.horizontalAccuracy) {
_bestEffort = location;
// Let the delegate know
if (self.delegate && [self.delegate respondsToSelector:@selector(location:didUpdateLocationTo:)]) {
[self.delegate location:self didUpdateLocationTo:location];
}
if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {
// Great, we've found our final location so stop searching!
[self stopTrackingLocation];
// Let our delegate know we've finished our work
if (self.delegate && [self.delegate respondsToSelector:@selector(location:didFinishTrackingLocationWithFinalLocation:)]) {
[self.delegate location:self didFinishTrackingLocationWithFinalLocation:location];
}
}
}
}
一切有意义此代码,但我似乎无法使其正常工作。当我通过代码,我发现
- locationAge小于5,这是很好的
- 位置horizontalAccuracy小于0,这是很好
- bestEfforts水平精度相同的位置水平准确性,所以它永远不会进入该条件
- 即使它做到了,它也不会调用
stopTrackingLocation
方法,因为horizontalAccuracy的位置永远不会是< 0(第二个if语句),但是,我的位置管理器所需的准确度为-2(最佳对于导航),所以它从来没有实际上离开这个方法。
我在做什么错,或者我应该如何改变它以正确工作?
问题是,您正试图获得水平精度低于您所需的精度的位置。
if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {
然而,常数kCLLoationAccuracyBestForNavigation
和kCLLocationAccuracyBest
不是真正的价值,他们是-2和-1分别。
问题是你真的需要什么准确性需要为你的目的?这是你应该检查的价值。为了测试目的,使用100米。这意味着你可能有一个使用GPS的位置,而不仅仅是WiFi或者蜂窝。
if (location.horizontalAccuracy <= 100) {
实际horizontalAccuracy绝不会小于5米,与iPhone 5,它可以是取决于有多少颗卫星是可见的,其几何形状10或20或50。如果系统根本无法修复,它也可以是-1。这就是这条线是,忽略那些无效的位置:
if (location.horizontalAccuracy < 0) return;
编辑:
常数kCLLoationAccuracyBestForNavigation
当你配置CLLocationManager对象的desiredAccuracy
财产kCLLocationAccuracyBest
,才应使用。 desiredAccuracy
设置将核心位置硬件配置为启用GPS,GLONASS等,以尝试以满足您所需的准确性(并不保证它会被满足)。
desiredAccuracy
是不是您应该在委托方法中使用的值,它只是在那里配置CLLocationManager。
我明白代码在做什么以及为什么它永远不会返回。我无法弄清楚为什么导航和最佳准确度值是-1和-2,并且我找不到任何以这种方式使用它们的例子。我已经将代码降到了最接近的10米,因为精确度不是很重要,但我确实希望能够从用户位置(准确地)检索地址,因为它将用于导航目的。 – PaReeOhNos
我添加了更多上面我的回答解释说,你仍然想使用这些常量,但只有在设置'desiredAccuracy'属性时。 – progrmr
很好的解释,欢呼:) – PaReeOhNos
horizontalAccuracy小于0表示该位置无效。 – progrmr
为什么你想要的准确度为'-2'?它应该是一个正值,如50或100,取决于您需要多少准确度(以米为单位)? – progrmr
这就是我的想法,但这正是我所得到的。我传入'kCLLoationAccuracyBestForNavigation'并获得-2,'kCLLocationAccuracyBest'则传递-1。我把它改成了10米,看起来不错,但我仍然不明白为什么我会为其他两个获得-1/-2? – PaReeOhNos