在模拟器中,此方法只执行一次。
然而,当使用真实手机进行测试时,它会在同一位置运行多次。
我想控制这种方法的频率。
或者是否可以通过distanceFilter?
如果可能,该怎么办?
我怀疑只要位置发生变化,就会自动运行locationManager(_:didUpdateLocations :)方法,因此我无法控制它。
有办法吗?
import UIKit
import CoreLocation
class MainViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// my source code
}
}
答案 0 :(得分:1)
可接受的答案颇具误导性,自iOS 6起不推荐使用功能func locationManager(_ manager: CLLocationManager, didUpdateTo newLocation: CLLocation, from oldLocation: CLLocation)
。
设置所需的精度应解决在相对相同的点上获得许多更新的问题。对于不太精确的跟踪,请尝试
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
如果您担心长时间运行的跟踪任务/作业,请考虑实施
func locationManagerDidPauseLocationUpdates(CLLocationManager)
func locationManagerDidResumeLocationUpdates(CLLocationManager)
他们会通知您位置没有改变,并且为了节省电量,设备将关闭一些硬件。
答案 1 :(得分:0)
您可以设置位置准确度,如
self. locationManager.desiredAccuracy = kCLLocationAccuracyBest
请参阅https://developer.apple.com/documentation/corelocation/cllocationaccuracy
答案 2 :(得分:0)
我不确定你能控制它。您可以使用func locationManager(_ manager: CLLocationManager, didUpdateTo newLocation: CLLocation, from oldLocation: CLLocation) { }
方法。此方法为您提供最后位置和新位置,并代表这些位置,您可以执行所需的功能。
或者你可以参考这个答案click here
答案 3 :(得分:0)
位置不会随模拟器而改变。您只会从didupdatelocations回调中获得一个调用。在真实设备上运行将导致完成处理程序连续触发。您可以使用GPX文件模拟位置,但我相信使用模拟器后,它不会触发更多的位置。
所需的准确度确实会改变发射频率,但该频率还取决于GPS硬件和电池寿命状态。 iOS将频率控制到一定程度以优化设备性能和寿命