didUpdateLocations而不是didUpdateToLocation
随着iOS6的发布,苹果希望我们使用didUpdateLocations而不是doUpdateToLocation。 任何人都可以解释如何正确使用didUpdateLocations?
我假设你使用下面的代表来获得最后的位置?
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
上面的委托在iOS 6中已被弃用。现在应该使用以下代码:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
为了获得最后的位置,只需获取数组的最后一个对象:
[locations lastObject]
换句话说, [locations lastObject]
(新委托)等于newLocation
(旧委托)。
这里没有其他答案解释了为什么有一个位置数组,以及如何正确使用提供的新的didUpdateLocations:数组。
废弃locationManager:didUpdateToLocation:fromLocation:
并发送位置NSArray的目的是为了在后台运行时降低功耗。
从iPhone 5开始,GPS芯片能够存储一段时间的位置,然后将它们一次全部传送到一个arrays中。 这被称为延期位置更新。 这允许主CPU在后台进行较长时间的hibernate。 这意味着iOS不必为每个位置更新启动主CPU,CPU可以hibernate,而GPS芯片则收集位置。
您可以使用deferredLocationUpdatesAvailable
方法检查此function。 如果可用,您可以使用allowDeferredLocationUpdatesUntilTraveled:timeout:
方法启用它。 一些条件适用,请参阅此答案的详细信息。
它给你一些对象来访问你可以使用的最后一个位置
[locations lastObject]
从这个委托方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
这就是该方法可以如何实现与已弃用的方法类似的工作方式
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *newLocation = locations.lastObject; CLLocation *oldLocation; if (locations.count > 1) { oldLocation = locations[locations.count - 2]; } }
如果你同时支持iOS 5和6,你应该打电话
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations,
从年纪大了
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
函数,通过构build一个位置数组。
值得注意的是,locationManager:didUpdateLocations返回的CLLocation对象数组可能包含或不包含以前的位置。 换句话说,在极less数情况下,arrays中只有一个位置。 使用以下来检查,如果有多个对象,我们可以检索最近的在先位置:
int objCount = [locations count]; if (objCount > 1) { CLLocation *oldLocation = [locations objectAtIndex:objCount - 1]; }
由于数组中至less有一个对象,通过请求数组中的最后一个对象来完成当前位置的检索。 即使最后一个对象是唯一的对象,那也没关系:
CLLocation *newLocation = [locations lastObject];
请记住,因为这是一个数组,上面示例中的oldLocation不一定是您正在查找的那个。 这取决于你如何setDistanceFilter:和desiredAccuracy:属性,因为这些属性将影响你的位置数组是如何填充的。 所需的oldLocation可能被埋在arrays的更深处。