更新当前位置

时间:2015-05-29 18:55:04

标签: swift

let locationManager = CLLocationManager()

@IBOutlet var map: MKMapView!

func getLocation ()-> CLLocation! {
    self.locationManager.startUpdatingLocation()
    sleep(1)
    self.locationManager.stopUpdatingLocation()
    var x = locationManager.location
    return x
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.requestWhenInUseAuthorization()

    var mapCoord:CLLocation! = getLocation()
    var mapLat:Double! = mapCoord.coordinate.latitude //Where the thread error is
    var mapLong:Double! = mapCoord.coordinate.longitude
//Setup of the rest of the map is completed

我的代码如上所述,在Swift中。我收到一个错误:

  

意外零值的线程错误

getLocation()函数调用坐标时。我更改了mapLatmapLong以测试导致nil的原因。我的应用程序将加载,但我在输出中收到一条消息,说我当前的位置无法更新,因为我没有要求许可;但是,我确实具有在viewDiDLoad()开始时请求权限的功能。我以前在一个不同的项目中使用过这种格式并且它已经有效,所以我知道我必须遗漏一些明显的东西,等等。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的代码非常错误,无法使用。

您无法编写程序代码来启动位置更新,暂停,停止位置更新,然后获取位置。

您必须将自己设置为位置管理员的委托,开始位置更新并返回。

在此之后的某个时刻,系统会调用您的locationManager:didUpdateLocations方法。

然后,您需要检查所获得位置的准确性,并确保其准确性。 (通常情况下,首次启动GPS时,您获得的前几个位置读数非常糟糕,并且不符合您所需的准确度。我建议水平精度为200 M左右,具体取决于您的应用程序的要求。

如果您的阅读量足够准确,您可以关闭更新并根据需要使用该位置。

P.S。永远不要永远使用主线程上的sleep()函数。事实上,作为新手iOS Mac OS开发人员,您应该假装睡眠功能不存在。

答案 1 :(得分:0)

试试这个。您需要请求权限,并且只有拥有有效权限才能开始更新。

typealias Location = CLLocation

//MARK: Private Variables
private let locationManager = CLLocationManager()
private var currentLocation: Location? {
    didSet {
        // You have a new location. Use it somehow
    }
}

//MARK: View Lifecycle
override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self
}

override func viewWillAppear(animated: Bool) {
    // Ask for permission if necessary
    let currentStatus = CLLocationManager.authorizationStatus()
    if currentStatus == .Restricted || currentStatus == .Denied || currentStatus == .NotDetermined {
        locationManager.requestWhenInUseAuthorization()
    } else {
        locationManager.startUpdatingLocation()
    }
}

//MARK: CLLocationManagerDelegate
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == .AuthorizedWhenInUse {
        locationManager.startUpdatingLocation()
    }
}

func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
    newLocation
    currentLocation = newLocation
    locationManager.stopUpdatingLocation()
}