为什么didUpdateLocations位置NSArray中永远不会有多个位置?

时间:2014-12-30 04:19:53

标签: ios objective-c cllocationmanager

我设置了以下方法:

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

它正常工作并被调用,但它永远不会包含多个位置。我试图在手机移动时获得新旧位置之间的距离。我错过了什么吗?位置数组中从不存在两个项目。

3 个答案:

答案 0 :(得分:3)

正如didUpdateLocations的文档所说数组是......

  

...包含位置数据的CLLocation个对象数组。此数组始终包含至少一个表示当前位置的对象。如果延迟更新或者在交付之前多个位置到达,则阵列可能包含其他条目。数组中的对象按它们出现的顺序组织。因此,最近的位置更新位于数组的末尾。

通常情况下,您通常只有一个位置,因此您应该跟踪自己的财产,并在此处存储您上一次收到的上一个有效位置didUpdateLocations调用。

答案 1 :(得分:1)

你做得对。通常情况下,locationManager:didUpdateLocations:只会有一个位置,尤其是当您的应用被预先制定,位置服务最近处于活动状态时,等等。

可以,但它有多个位置 - 通常在不太常见的情况下,例如如果您的应用程序已启动以进行后台位置更新,并且其他应用程序在启动时会进入。

所以不要出汗。但无论如何,你会想要跟踪这些旧的'你自己定位 - 不是数组会包含碰巧你想要的历史位置的情况。相反,它更可能是陈旧的#39;在某些情况下可能足够的数据,或堆积的更新。

添加了: 要跟踪手机的移动方式,您需要在自己跟踪位置的班级中保留自己的CLLocation变量。您需要确定要实现的业务逻辑。如果你想要字面上每个更新和最后一个更新之间的距离,只需添加一个名为lastLocation的变量并使用CLLocation' s distanceFromLocation:来获得差异。 (有关详情,请参阅Apple开发者网站上的the docs。)

但我怀疑这是你想要的。那么你每次可能得到1米,而且从来没有真正知道你是否在一个方向上走了1000米。 。 。 。或来回反弹并留在同一地点。

您可能需要拥有某种最低时间戳 - 因此,当有新的更新时,请将theNewLocation.timestamptheOldLocation.timestamp进行比较,并且只测量距离,例如,它是&#39已经至少十分钟了。

(如果您执行的操作时间超过几秒钟,则最好在两者之间关闭位置更新。)

或许,您可能还想使用其他逻辑。例如,仅在新位置与前一个位置不同的城市时获取距离,或者在距离旧位置至少500米的位置时将新位置添加到阵列中,或者等等。 ,严重依赖于想要对数据做什么。

答案 2 :(得分:0)

以下内容:from已弃用,并且根据文档中的说明,您可能希望手动保留旧位置。

我不会将多项情况(强调我的)视为你所暗示的所需。

  

包含位置数据的CLLocation对象数组。此数组始终包含至少一个表示当前位置的对象。 如果延迟更新或者多个位置在交付之前到达,则阵列可能包含其他条目。阵列中的对象按其发生的顺序进行组织。因此,最近的位置更新位于数组的末尾。

[编辑]

就实际距离而言,请查看以下答案:Calculating Distance between two coordinates using CLLocation