didUpdateLocations而不是didUpdateToLocation

时间:2012-09-26 13:07:44

标签: ios objective-c swift core-location cllocationmanager

随着iOS6的发布,Apple希望我们使用didUpdateLocations而不是didUpdateToLocation。任何人都可以解释如何正确使用didUpdateLocations吗?

6 个答案:

答案 0 :(得分:122)

我认为你使用以下代表来获得最后一个职位?

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation

上面的代理在iOS 6中已弃用。现在应使用以下代码:

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateLocations:(NSArray *)locations

为了获得最后一个位置,只需获取数组的最后一个对象:

[locations lastObject]

换句话说,[locations lastObject](新代表)等于newLocation(旧代表)。

答案 1 :(得分:63)

这里没有其他答案解释为什么有一个位置数组以及如何正确使用新提供的didUpdateLocations:数组。

弃用locationManager:didUpdateToLocation:fromLocation:并发送NSArray位置的目的是减少在后台运行时的功耗。

从iPhone 5开始,GPS芯片能够存储一段时间的位置,然后在阵列中一次性传送所有位置。这称为延迟位置更新。这允许主CPU在后台睡眠更长的时间。这意味着iOS不需要为每个位置更新启动主CPU,CPU可以睡眠,而GPS芯片会收集位置。

您可以使用deferredLocationUpdatesAvailable方法检查此功能。如果可用,您可以使用allowDeferredLocationUpdatesUntilTraveled:timeout:方法启用它。某些条件适用,有关详细信息,请参阅this answer

答案 2 :(得分:22)

它为您提供了一组对象,可以访问您可以使用的最后位置

[locations lastObject]

来自此委托方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

答案 3 :(得分:7)

这就是如何实现该方法以与弃用的方法类似的方式

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations.lastObject;
    CLLocation *oldLocation;
    if (locations.count > 1) {
        oldLocation = locations[locations.count - 2];
    }
}

答案 4 :(得分:3)

如果您同时支持iOS 5和6,则应致电

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations, 

来自旧版

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

功能,通过构建位置数组。

答案 5 :(得分:2)

值得注意的是,locationManager:didUpdateLocations返回的CLLocation对象数组:可能包含也可能不包含以前的位置。换句话说,在极少数情况下,阵列中可能只有一个位置。使用以下内容进行检查,如果有多个对象,我们可以检索最近的先前位置:

int objCount = [locations count];
if (objCount > 1) {
    CLLocation *oldLocation = [locations objectAtIndex:objCount - 1];
}

由于数组中至少有一个对象,因此通过请求数组中的最后一个对象来检索当前位置。即使最后一个对象是唯一的对象,也没关系:

CLLocation *newLocation = [locations lastObject];

请记住,因为这是一个数组,上面显示的示例中的oldLocation不一定是您要查找的那个。这取决于setDistanceFilter:和desiredAccuracy:properties的方式,因为这些属性将影响您的位置数组的填充方式。所需的oldLocation可能会深埋在数组中。