我是一个初学者,我正在制作一个应用程序,得到用户的协调。我正在制作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秒后得到了坐标)。
老实说,我是iOS开发中的新手,得到5-7秒左右的坐标位置是正常的吗?我能改进这个吗?
我怀疑是因为我所使用的精确性是kCLLocationAccuracyBest,但是如果我更改为kCLLocationAccuracyHundredMeters,这似乎是一样的。
那么,我能改进这个吗?因为如果我和android相比,得到坐标位置的速度很快。
发布于 2018-03-06 15:01:12
正如我在我的注释中所说的,如果您使用较小的精度值,让我们说kCLLocationAccuracyThreeKilometers,您应该更早地获得一个有效的位置,但是通常CLLocationManager需要一些时间才能得到一个有效的位置,因为大多数位置管理器任务都是异步运行的。
苹果文档对的看法
声明
var desiredAccuracy: CLLocationAccuracy { get set }讨论 接收机尽最大努力达到所要求的精度,但实际精度却得不到保证。 您应该为此属性分配一个适合您的使用场景的值。例如,如果您只需要在1公里内指定当前位置,则应该指定
kCLLocationAccuracyKilometer而不是kCLLocationAccuracyBestForNavigation。以更高的精度确定位置需要更多的时间和更多的功率。 当请求高精度的位置数据时,由位置服务交付的初始事件可能没有所要求的准确性。location服务尽可能快地传递初始事件。然后,它继续以您请求的准确性确定位置,并在有数据可用时,根据需要交付额外的事件。 对于iOS和macOS,此属性的默认值为kCLLocationAccuracyBest。对于watchOS,默认值是kCLLocationAccuracyHundredMeters。 此属性仅与标准位置服务一起使用,在监视重大位置更改时不使用。
https://stackoverflow.com/questions/49127564
复制相似问题