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的更深处。