didUpdateLocations而不是didUpdateToLocation

Yog*_*ton 66 objective-c core-location cllocationmanager ios swift

随着iOS6的发布,Apple希望我们使用didUpdateLocations而不是didUpdateToLocation.谁能解释如何正确使用didUpdateLocations?

Ann*_*nne 126

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

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
Run Code Online (Sandbox Code Playgroud)

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

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateLocations:(NSArray *)locations
Run Code Online (Sandbox Code Playgroud)

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

[locations lastObject]
Run Code Online (Sandbox Code Playgroud)

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

  • @Anne旧位置怎么样? (3认同)
  • oldLocation对象不是数组中倒数第二个对象的第二个吗? (2认同)

pro*_*rmr 64

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

弃用locationManager:didUpdateToLocation:fromLocation:和发送NSArray位置的目的是降低在后台运行时的功耗.

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

您可以使用该deferredLocationUpdatesAvailable方法检查此功能.如果可用,您可以使用allowDeferredLocationUpdatesUntilTraveled:timeout:方法启用它.有些条件适用,详情请参阅此答案.

  • 感谢您对此更改的解释. (2认同)

Jan*_*mal 22

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

[locations lastObject]
Run Code Online (Sandbox Code Playgroud)

来自这个委托方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
Run Code Online (Sandbox Code Playgroud)

  • 此iOS6调用中不再提供该(旧位置).如果我需要比较,我通常将最新的位置存储在名为`old_location`的实例变量中.到达新位置后,我将比较实例变量"old_location"并执行某些操作......或不执行操作.然后我将`old_location`更新为刚给我的新的.这使得`old_location`与最后已知的位置保持同步. (2认同)

Gro*_*oot 7

这就是如何实现该方法以与已弃用的方法类似地工作

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