为啥 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
的变量并使用CLLocation
的distanceFromLocation:
来获得差异。 (有关更多信息,请参阅 Apple 开发者网站上的 the docs。)
但我怀疑这正是你想要的。那么你可能每次都走 1 米,但永远不知道你是否在一个方向上走了 1000 米。 . . .或来回弹跳并停留在同一个位置。
您可能需要某种最小时间戳 - 因此,当有新更新到来时,将 theNewLocation.timestamp
与 theOldLocation.timestamp
进行比较,并且仅在至少十分钟时才测量距离。
(如果您执行的操作超过几秒钟,则最好在这期间关闭位置更新。)
或者,也许,您还想使用其他一些逻辑。例如,仅当新位置与前一个城市不同时才获取距离,或者当新位置最终距旧位置至少 500 米时将新位置添加到数组中,等等。这也取决于您想对数据做什么。
【讨论】:
好的,但是如何知道手机何时移动以及移动了多远?还有其他方法吗? 好的,让我修改我的答案。【参考方案3】:看起来 to:from 已被弃用,根据文档中的描述,您可能希望手动保留旧位置。
我不认为多项目案例(强调我的)是你所暗示的。
包含位置数据的 CLLocation 对象数组。该数组始终包含至少一个表示当前位置的对象。 如果更新被推迟,或者如果在交付之前到达了多个位置,则数组可能包含其他条目。数组中的对象按照它们发生的顺序进行组织。因此,最近的位置更新是在数组的末尾。
[编辑]
就实际距离而言,请查看以下答案:Calculating Distance between two coordinates using CLLocation
【讨论】:
以上是关于为啥 didUpdateLocations 位置 NSArray 中永远不会有多个位置?的主要内容,如果未能解决你的问题,请参考以下文章
错误:收集用户位置时,“代表必须响应 locationManager:didUpdateLocations:”
didUpdateLocations 被调用,但发送错误的位置
CLLocationManager 不会将位置发送到 didUpdateLocations 方法
每次 viewWillAppear 发生重大位置变化时调用 didUpdateLocations
UICollectionView 的 99% CPU 使用率 - 显着位置更改未调用“didUpdateLocations”