我是初学者,我正在制作一个让用户协调的应用程序。我正在制作像下面这样的locationManager类
import UIKit
import CoreLocation
class LocationManager: NSObject {
let manager = CLLocationManager()
var didGetLocation: ((Coordinate?) -> Void)?
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestLocation()
}
func getPermission() {
// to ask permission to the user by showing an alert (the alert message is available on info.plist)
if CLLocationManager.authorizationStatus() == .notDetermined {
manager.requestWhenInUseAuthorization()
}
}
}
extension LocationManager : CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
manager.requestLocation()
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error.localizedDescription)
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.first else {
didGetLocation?(nil)
return
}
let coordinate = Coordinate(location: location)
if let didGetLocation = didGetLocation {
didGetLocation(coordinate)
}
}
}
private extension Coordinate {
init(location: CLLocation) {
latitude = location.coordinate.latitude
longitude = location.coordinate.longitude
}
}
我只需调用didGetLocation
属性即可获取用户的坐标位置。上面的代码实际上可以得到坐标数据。但我认为这需要太多时间(我在5-7秒后得到了坐标)。
我怀疑因为我使用的所需精确度是kCLLocationAccuracyBest
,但如果我更改为kCLLocationAccuracyHundredMeters
,它似乎是相同的
所以,我可以改进这个吗?因为如果我与android比较,它获取坐标位置的速度非常快
答案 0 :(得分:1)
正如我在评论中所说,如果您使用较小的准确度值,请说kCLLocationAccuracyThreeKilometers
您应该提前获得有效位置,但通常CLLocationManager
需要一些时间才能获得有效位置,因为大多数位置管理员任务异步运行
Apple Docs对此有何评论
<强>声明强>
var desiredAccuracy: CLLocationAccuracy { get set }
<强>讨论强>
接收器尽力达到要求的准确度;然而, 实际的准确性无法保证。
您应该为此属性指定适合的值 你的使用场景。例如,如果您需要当前位置 只有一公里,你应该指定
kCLLocationAccuracyKilometer
而不是kCLLocationAccuracyBestForNavigation
。 使用确定位置 更高的准确性需要更多的时间和更多的力量。请求高精度位置数据时,初始事件 由位置服务提供可能没有您的准确性 请求。定位服务可以快速提供初始事件 尽可能。然后它继续确定位置 您要求的准确性,并根据需要提供其他活动, 当这些数据可用时。
对于iOS和macOS,此属性的默认值为
kCLLocationAccuracyBest
。对于watchOS,默认值为kCLLocationAccuracyHundredMeters
。此属性仅与标准位置一起使用 在监控重要的位置变化时不使用服务。