我正在创建一个应用程序,我必须知道该位置是有效的,不是缓存的,还是当前的。
它是一个显示您附近的应用程序(包含数据库和内容)
每10秒钟我从网络中获取数据并在tableView中显示新数据。
让我们说我在商店附近,应用程序显示"你离商店很近"
我关闭应用程序,回家,当我打开应用程序时它仍然显示"你离商店很近"即使我要求了位置..
这是因为它首先返回一个缓存的值..
好的,我 那个哑巴,所以我修复了它:
(我将有效位置保存到userLocation对象中)
因此,当用户关闭应用程序并返回时,它会检查位置是否太旧...如果是,则 userLocation对象被清除, locationManager?.requestLocation()被称为
但是,在didUpdateLocations函数中,它会检查位置是否太旧,如果不是,也就是新的,那么我会从网上获取新数据
// Location Functions
func setupLocationManager(){
let authorizationStatus = CLLocationManager.authorizationStatus()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
locationManager?.startUpdatingLocation() // Log only significant location changes
locationManager?.pausesLocationUpdatesAutomatically = true // If user is not moving, don't update location
locationManager?.desiredAccuracy = kCLLocationAccuracyNearestTenMeters // Ten meter accuracy
locationManager?.distanceFilter = 20 // Update location only if 20m location change
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
currentLocation = locations.last
// Check if location is not too old.. (aka cached)
let locationIsValid:Bool = Date().timeIntervalSince(currentLocation!.timestamp) < 11
if locationIsValid
{
currentLocationValue = currentLocation?.coordinate
// If first loc after opening / returning to app, then fetch data
if (userLocation.latitude == nil && userLocation.longitude == nil){
userLocation.location = currentLocation
userLocation.latitude = currentLocationValue?.latitude
userLocation.longitude = currentLocationValue?.longitude
mainFetchData()
}
userLocation.location = currentLocation
userLocation.latitude = currentLocationValue?.latitude
userLocation.longitude = currentLocationValue?.longitude
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
// Error so remove global variable user location
userLocation.location = nil
userLocation.latitude = nil
userLocation.longitude = nil
}
// THIS GETS CALLED EVERYTIME applicationDidBecomeActive !
@objc func notification_validateCachedLocation(){
if userLocation.location != nil {
let lastCachedLocationIsInvalid:Bool = Date().timeIntervalSince(userLocation.location!.timestamp) > 10
if lastCachedLocationIsInvalid
{
userLocation.location = nil
userLocation.latitude = nil
userLocation.longitude = nil
locationManager?.requestLocation()
}
} else {
locationManager?.requestLocation()
}
}
但仍有问题:
让我们说你只是回家...你打开应用程序,它会保存你的位置。然后关闭它。
好的,所以在选择了20分钟之后,你又回来再打开应用程序..
然后,LocationManager加载位置,因为您没有移动,因此它不会更新。因此,它将超过10秒,它将只是一个缓存的位置,因此我的应用程序将无法获取数据:C
答案 0 :(得分:0)
在我看来,你应该自动停止使用pausesLocationUpdates,只是在适合你的时候手动暂停它(停止定位)。