【发布时间】:2011-01-16 18:11:51
【问题描述】:
我想知道是否有某种方法可以使 CLLocationManager 不会自动返回缓存位置。我知道文件说“位置服务尽快返回初始位置,在可用时返回缓存信息”但是这个缓存的位置可能离用户的当前位置非常远,如果可能的话,我希望它更精确。
感谢您的帮助!
【问题讨论】:
标签: iphone cocoa-touch location cllocationmanager caching
我想知道是否有某种方法可以使 CLLocationManager 不会自动返回缓存位置。我知道文件说“位置服务尽快返回初始位置,在可用时返回缓存信息”但是这个缓存的位置可能离用户的当前位置非常远,如果可能的话,我希望它更精确。
感谢您的帮助!
【问题讨论】:
标签: iphone cocoa-touch location cllocationmanager caching
你无法阻止它缓存,但过滤掉缓存的数据并不难。核心位置包括带有位置的时间戳。将位置的时间戳与您的应用启动时保存的时间戳进行比较,您将能够分辨出哪些位置是旧的(缓存,在您的应用声明之前找到),哪些是新的。扔掉旧的。
位置时间戳是一个 NSDate,因此只需在您的应用启动时获取 [NSDate date] 的值,并在过滤位置时将其用作您的参考点。一旦您开始获取新数据,您甚至可以丢弃参考值,并将零参考日期视为暗示应该信任新位置。
【讨论】:
-(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
}
}
【讨论】:
您可以使用 CLLocationManager 的这个属性:
@property(readonly, NS_NONATOMIC_IPHONEONLY) CLLocation *location;
如果从未检索到任何位置数据,则此属性的值为 nil,否则,这是 CoreLocation 缓存其数据的位置。因此,如果您总是想从头开始,只需检查此属性是否为nil。如果是nil,那就没问题;否则,您需要停止您的位置管理器并重新启动它:这将强制更新,这将导致缓存值被您刚刚触发的新值覆盖。
【讨论】: