ios - Objective-C : get location without delegate

标签 ios objective-c delegates location

我在 Objective C 中遇到问题(为 iPhone 编写应用程序)。我知道如何使用 locationManager 及其委托(delegate)。一旦我在 locationManager 上调用了 startUpdatingLocation,它就会在位置更新时调用委托(delegate)方法 didUpdateToLocation。但问题是,这种方式现在适合我想做的事情。我有一个方法(在类中)如下所示:

@implementation SomeClass

   - (someType)getDbContentsOrderByDistance
   {
      ... //here I need the current location
      return dbContents;
   }

@end

现在此函数从 sqlite 数据库中选择条目,这些条目按到用户当前位置的距离排序。这就是为什么我需要这个函数中的位置。在上面的方法中我想做的是:获取位置,然后从数据库中选择东西并返回它。我知道我可以尝试访问 locationManager.location.coordinate.longitude,但我知道在第一个位置更新到达之前,里面不会有任何有用的东西。而且我不想在之前(例如,在启动应用程序时)开始位置更新,因为如果我只需要一次位置,那将不会非常有效。

我知道如何按照位置更新一到达就调用委托(delegate)的方式来执行此操作。问题是我不知道如何从那里获取更新的位置到我上面的方法中。基本上我需要让方法“等待”,直到有第一个位置更新,然后继续执行该位置。

感谢您的帮助!

最佳答案

简短的回答是,你不能。获取用户位置是一个异步过程,而且必须是一个异步过程。该设备必须启动各种硬件,如 GPS、蜂窝塔定位器和 WiFi 三角测量系统,从这些不同的设备获取输入,并将其合成到一个位置。这需要几秒钟的时间。

Putz 关于启动计时器的建议是一个很好的建议。不过,我会添加一些内容。

通常,您从位置管理员那里得到的第一个读数非常糟糕,应该丢弃。您获得的第一个读数通常是 GPS 处于事件状态时的最后一个位置读数,并且会有一个过时的时间戳。该位置的准确度读数可能看起来相当不错,但这是一个谎言。我已经看到第一个位置读数偏离了几公里。您需要检查位置更新的时间戳,并丢弃任何超过 1 秒的读数。

一旦您丢弃了陈旧的读数,前几次位置更新通常非常糟糕,因为 GPS 尚未稳定下来。水平精度读数(这实际上是一个“混淆圈”,或可能位置的半径)是一个荒谬的大值,有时一公里或更多。同样,您需要编写位置管理器委托(delegate)方法来丢弃过于不准确的读数。我建议丢弃水平精度读数 >= 100 米的值。您可以容忍多少不准确取决于具体的称谓,但要注意不要使准确度要求过于准确。有时 GPS 拒绝安定下来。如果您需要 5 米的精度,您可能无法在应用程序的整个运行期间获得可接受的精度。 (如果您在城市环境、建筑物或其他存在大量 GPS 信号干扰/障碍的区域)

一旦您最终获得足够准确的值,请保存该位置并将您的 locationAvailable 标志设置为 YES。

请注意,您可以使用通知管理器来广播“找到了一个好位置”消息,而不是计时器。任何需要位置信息的对象都可以注册您的通知,并在位置管理器获得可接受的位置读数时被调用。

关于ios - Objective-C : get location without delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166521/

相关文章:

iphone - 如何为 iPhone 构建不同高度图像的 3 列布局

c++ - 为什么 __weak 属性需要运行时支持

c# - 如何推断具有继承类型的类型参数?

C#函数作为参数

objective-c - 如何将某些 View 的自动旋转限制为单一方向,同时允许其他 View 的所有方向?

c# - 动态延迟 IObservable 值的延迟函数

ios - 在没有 DTrace 的情况下,Instruments 如何从 iOS 收集数据?

android - React Native - 页脚按钮

ios - 重用dispatch_get_main_queue()/dispatch_get_global_queue()的结果是否安全?

iphone - 构建数组的数组