Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios DidUpdateLocation而不是DidUpdateLocation_Ios_Objective C_Swift_Core Location_Cllocationmanager - Fatal编程技术网

Ios DidUpdateLocation而不是DidUpdateLocation

Ios DidUpdateLocation而不是DidUpdateLocation,ios,objective-c,swift,core-location,cllocationmanager,Ios,Objective C,Swift,Core Location,Cllocationmanager,随着iOS6的发布,苹果希望我们使用DidUpdateLocation而不是DidUpdateLocation。有人能解释一下如何正确使用didUpdateLocations吗?我知道你使用了下面的代表获得了最后一个职位 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocatio

随着iOS6的发布,苹果希望我们使用DidUpdateLocation而不是DidUpdateLocation。有人能解释一下如何正确使用didUpdateLocations吗?

我知道你使用了下面的代表获得了最后一个职位

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
上面的委托在iOS 6中不推荐使用。现在应使用以下内容:

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateLocations:(NSArray *)locations
要获取最后一个位置,只需获取数组的最后一个对象:

[locations lastObject]

换句话说,
[locations lastObject]
(新代理)等于
新位置
(旧代理)。

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

[locations lastObject]
从这个委托方法

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

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

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

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

函数,通过构建位置数组。

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

弃用
locationManager:didUpdateToLocation:fromLocation:
并发送位置数组的目的是降低在后台运行时的功耗

从iPhone5开始,GPS芯片能够在一段时间内存储位置,然后以阵列形式一次发送所有位置。这称为延迟位置更新。这允许主CPU在后台长时间睡眠。这意味着iOS不必为每次位置更新启动主CPU,CPU可以休眠,而GPS芯片收集位置


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

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

int objCount = [locations count];
if (objCount > 1) {
    CLLocation *oldLocation = [locations objectAtIndex:objCount - 1];
}
由于数组中至少有一个对象,因此通过请求数组中的最后一个对象来检索当前位置。即使最后一个对象是唯一的对象,也没关系:

CLLocation *newLocation = [locations lastObject];

请记住,因为这是一个数组,所以上面显示的示例中的oldLocation不一定就是您要查找的位置。这取决于您如何设置DistanceFilter:和desiredAccuracy:属性,因为这些属性将影响位置数组的填充方式。所需的oldLocation可能在阵列中埋得更深。

这就是如何实现该方法,使其与不推荐的方法类似

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

@Anne关于旧位置呢?@S.J您可以通过保存以前对委托方法的调用来获取旧位置。结尾有一个例子,oldLocation对象不是数组中倒数第二个对象吗?这仍然是CLLocation对象吗?还是NSString?@windsound Yes[locations lastObject]是CLLocation对象。旧位置呢?如何获取?此iOS6调用中不再提供该(旧位置)。如果需要比较,我通常将最新位置存储在名为
old_location
的实例变量中。到达新位置后,我将与实例变量
old_location
进行比较,然后做一些事情……或者不做。然后我将
旧位置更新为刚刚给我的新位置。这使
old_location
与上一个已知位置保持同步。感谢您对更改的解释。这是我真正想知道的答案。非常感谢。