如何在Swift中加速从GPS获取坐标位置?

时间:2018-03-06 09:35:53

标签: ios swift gps

我是初学者,我正在制作一个让用户协调的应用程序。我正在制作像下面这样的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比较,它获取坐标位置的速度非常快

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,如果您使用较小的准确度值,请说kCLLocationAccuracyThreeKilometers您应该提前获得有效位置,但通常CLLocationManager需要一些时间才能获得有效位置,因为大多数位置管理员任务异步运行

Apple Docs对此有何评论

  

<强>声明

var desiredAccuracy: CLLocationAccuracy { get set }
  

<强>讨论

     

接收器尽力达到要求的准确度;然而,   实际的准确性无法保证。

     

您应该为此属性指定适合的值   你的使用场景。例如,如果您需要当前位置   只有一公里,你应该指定   kCLLocationAccuracyKilometer而不是   kCLLocationAccuracyBestForNavigation使用确定位置   更高的准确性需要更多的时间和更多的力量

     

请求高精度位置数据时,初始事件   由位置服务提供可能没有您的准确性   请求。定位服务可以快速提供初始事件   尽可能。然后它继续确定位置   您要求的准确性,并根据需要提供其他活动,   当这些数据可用时。

     

对于iOS和macOS,此属性的默认值为   kCLLocationAccuracyBest。对于watchOS,默认值为   kCLLocationAccuracyHundredMeters

     

此属性仅与标准位置一起使用   在监控重要的位置变化时不使用服务。