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

Posted

技术标签:

【中文标题】为啥 didUpdateLocations 位置 NSArray 中永远不会有多个位置?【英文标题】:Why does didUpdateLocations locations NSArray never have more than one location in it?为什么 didUpdateLocations 位置 NSArray 中永远不会有多个位置? 【发布时间】:2014-12-30 04:19:52 【问题描述】:

我设置了如下方法:

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

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

【问题讨论】:

【参考方案1】:

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

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

通常您是对的,而且通常只有一个位置,因此您应该跟踪您自己的财产,您将在其中存储上次调用 didUpdateLocations 时收到的最后一个有效位置。

【讨论】:

好的,谢谢,这是我的第二个想法,但希望 ios 会为你做到这一点,因此数组。 不。使用distanceFromLocation 方法将位置与之前的位置进行比较很容易(尽管要确保两个位置都具有非负的horizontalAccuracy),然后将保存的位置更新为当前位置。【参考方案2】:

你做对了。通常,locationManager:didUpdateLocations: 只会有一个位置,尤其是当您的应用处于前台、位置服务最近处于活动状态等时。

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

所以不要出汗。但在任何情况下,您都需要自己跟踪“旧”位置 - 数组不会包含恰好是您想要的历史位置。相反,它更有可能是在某些情况下可能就足够的“陈旧”数据,或者堆积更新。

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

但我怀疑这正是你想要的。那么你可能每次都走 1 米,但永远不知道你是否在一个方向上走了 1000 米。 . . .或来回弹跳并停留在同一个位置。

您可能需要某种最小时间戳 - 因此,当有新更新到来时,将 theNewLocation.timestamptheOldLocation.timestamp 进行比较,并且仅在至少十分钟时才测量距离。

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

或者,也许,您还想使用其他一些逻辑。例如,仅当新位置与前一个城市不同时才获取距离,或者当新位置最终距旧位置至少 500 米时将新位置添加到数组中,等等。这也取决于想对数据做什么。

【讨论】:

好的,但是如何知道手机何时移动以及移动了多远?还有其他方法吗? 好的,让我修改我的答案。【参考方案3】:

看起来 to:from 已被弃用,根据文档中的描述,您可能希望手动保留旧位置。

我不认为多项目案例(强调我的)是你所暗示的。

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

[编辑]

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

【讨论】:

以上是关于为啥 didUpdateLocations 位置 NSArray 中永远不会有多个位置?的主要内容,如果未能解决你的问题,请参考以下文章

未调用位置管理器 didUpdateLocations

错误:收集用户位置时,“代表必须响应 locationManager:didUpdateLocations:”

didUpdateLocations 被调用,但发送错误的位置

CLLocationManager 不会将位置发送到 didUpdateLocations 方法

每次 viewWillAppear 发生重大位置变化时调用 didUpdateLocations

UICollectionView 的 99% CPU 使用率 - 显着位置更改未调用“didUpdateLocations”