检查CLLocationManager.location是否为nil

时间:2014-12-30 03:52:43

标签: ios swift nstimer cllocationmanager

当我将我的区域缩放时,当locationManager.location尚未初始化时,我的应用程序崩溃了。

override func viewDidLoad() {
    ...
    let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCordinateSpanMake(0.01, 0.01))
    mkMapView.setRegion(regionToZoom, animated: true)
}

最初我只想做一个像这样的简单无限循环:

override func viewDidLoad() {
    ...
    while (true) {
        if locationManager.location != nil {
            println("locationManager is ready, carrying on")
            let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
            var timer:NSTimer? = nil
            break
        } else {
            println("locationManager is nil, waiting 2000ms")
            sleep(2)
    }
    ...
}

然而,发生了两件事。即将对mkMapView.setRegion()的调用抱怨无法看到regionToZoom,所以我不确定如何正确使其在循环外部可见,所以我只是将所有内容都放在while循环。这工作..然而现在我正在读,如果在任何时候我想在Swift中使用睡眠我可能应该使用NSTimer。因此,我发出了这个:

var timer:NSTimer? = nil

override func viewDidLoad() {
    ...
    self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkLOCMAN"), userInfo: nil, repeats: true)

    let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
    ...
}
// Function to check
func checkLOCMAN() {
        if locationManager.location != nil {
            println("locationManager.location is set, carrying on")
            self.timer?.invalidate()
        } else {
            println("locationManager.location is nil, waiting 2000ms")
    }
}

但这并没有解决问题,如果locationManager为零,它仍然会崩溃。我认为我采用了太多的脚本方法来处理这个问题,因为当它启动我的NSTimer时它不会感觉到它正在等待,但此后仍然继续执行代码行。

我有办法让这个工作吗?我只是希望它继续检查locationManager.location,直到它在运行mkMapView.setRegion()之前被初始化。

我还是Swift的新手,所以我可能会过度思考这个问题。

2 个答案:

答案 0 :(得分:4)

您不希望假设位置管理员拥有有效的location。您也不想拥有while循环或计时器,等待它。

您要做的是在viewDidLoad中启动位置服务,请求requestWhenInUseAuthorizationrequestAlwaysAuthorization的位置服务权限(确保NSLocationWhenInUseUsageDescription的相应plist字符串或已设置NSLocationAlwaysUsageDescription个密钥,然后等待didUpdateLocations的{​​{1}}方法被调用。只有这样你才能拥有一个有效的位置。

答案 1 :(得分:1)

由于这一行,您的崩溃可能正在发生:

let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))

因为locationManager.location.coordinate是零。

虽然我从风格的角度100%同意Rob的回答并且认为你应该将regionToZoom行放在didUpdateLocations内,如果你想在保留当前代码的同时避免错误,你可以从技术上做到这一点:

if locationManager.location != nil {
    let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
} else {
    self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkLOCMAN"), userInfo: nil, repeats: true)
}