【问题标题】:Stop Returning Cached CLLocationManager Location停止返回缓存的 CLLocationManager 位置
【发布时间】:2011-01-16 18:11:51
【问题描述】:

我想知道是否有某种方法可以使 CLLocationManager 不会自动返回缓存位置。我知道文件说“位置服务尽快返回初始位置,在可用时返回缓存信息”但是这个缓存的位置可能离用户的当前位置非常远,如果可能的话,我希望它更精确。

感谢您的帮助!

【问题讨论】:

    标签: iphone cocoa-touch location cllocationmanager caching


    【解决方案1】:

    你无法阻止它缓存,但过滤掉缓存的数据并不难。核心位置包括带有位置的时间戳。将位置的时间戳与您的应用启动时保存的时间戳进行比较,您将能够分辨出哪些位置是旧的(缓存,在您的应用声明之前找到),哪些是新的。扔掉旧的。

    位置时间戳是一个 NSDate,因此只需在您的应用启动时获取 [NSDate date] 的值,并在过滤位置时将其用作您的参考点。一旦您开始获取新数据,您甚至可以丢弃参考值,并将零参考日期视为暗示应该信任新位置。

    【讨论】:

    • 如果用户更改设备的日期和时间,此解决方案将不起作用。
    【解决方案2】:
    -(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation *)oldLocation 
    {
        if ([newLocation.timestamp timeIntervalSinceNow] > -10.0) // The value is not older than 10 sec. 
        { 
             // do something 
        } 
     }
    

    【讨论】:

      【解决方案3】:

      您可以使用 CLLocationManager 的这个属性:

      @property(readonly, NS_NONATOMIC_IPHONEONLY) CLLocation *location;
      

      如果从未检索到任何位置数据,则此属性的值为 nil,否则,这是 CoreLocation 缓存其数据的位置。因此,如果您总是想从头开始,只需检查此属性是否为nil。如果是nil,那就没问题;否则,您需要停止您的位置管理器并重新启动它:这将强制更新,这将导致缓存值被您刚刚触发的新值覆盖。

      【讨论】:

      • 您好,不可原谅:我已将文档解释为该位置缓存在系统级别(但如果这不准确,请告诉我)。这在那种情况下有效吗?
      • 据我所知,您所说的系统级别是位置属性;因此它应该工作。您可以通过在您的应用程序中使用核心位置来检查这一点,以便 location 属性不为零。然后,从设备中删除应用程序,将其关闭再打开,然后再次安装应用程序会导致出现确认面板(允许使用您的位置),并且我已验证在这种情况下 location 属性始终为零。现在,您无需执行所有这些操作,只需删除旧的缓存值,停止您的位置管理器并重新启动它
      • 您还可以在设置中重置位置警告;这也应该在不删除/重新安装您的应用的情况下重置位置属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多