Swift / Xcode6:"发现nil unwrapping optional"为我的用户的位置

时间:2015-02-19 19:18:23

标签: xcode swift geolocation optional

所以我遇到了一个奇怪的错误 - "fatal error: unexpectedly found nil while unwrapping an Optional value" ...

这很奇怪,因为它只是在运行模拟器的 FIRST 时间内失败了。只要我不退出模拟器并重新运行应用程序,它就不会失败,并且会成功找到用户位置。如果我退出模拟器,然后尝试重新运行应用程序,它将失败并出现相同的错误。

为什么会这样?在它真正被发现之前,是否以某种方式快速检查某个位置?

提前致谢。

override func queryForTable() -> PFQuery! {

    let query = PFQuery(className: "Yak")
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self // ? delegate
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()


    var userLocation:CLLocation = manager.location 

    currLocation = userLocation.coordinate // error occurs here        

    println(" my location is \([manager.location])")

    if let queryLoc = currLocation {
        println("ahahahaha")

        query.whereKey("location", nearGeoPoint:PFGeoPoint(latitude: queryLoc.latitude as CLLocationDegrees!, longitude: queryLoc.longitude as CLLocationDegrees!), withinMiles: 10)
        query.limit = 200
        query.orderByDescending("createdAt")

    }

1 个答案:

答案 0 :(得分:0)

我的猜测是你试图使用线性过程检索来自异步服务的数据。

这一行意味着:

manager.startUpdatingLocation()

经理开始更新位置,但这并不意味着它何时返回已经获得的位置。这可能需要一些时间,也可能会失败。

阅读位置的正确位置在didUpdateLocations的{​​{1}}方法中,我认为您已在视图控制器中设置。

第二次使用它的原因是因为在之前的运行中管理员确实有时间检测位置,所以你得到的是旧的,而不是最新的位置。

<强>更新

解决问题的一种可能方法是:

  • CLLocationManagerDelegate中检查viewDidLoad是否为零(它是一个隐式解包的可选项,因此您可以进行检查)
  • 如果它为零,则开始更新位置,添加userLocation.coordinate,可能禁用用户输入,并将标志(实例属性)设置为true,以跟踪您的等待时间一个位置
  • 等待UIActivityIndicator
  • 中的位置
  • 在该方法中,检查标志是否为真,如果是,则取消设置,删除进度视图并重新启用用户输入,然后调用locationManager(_:didUpdateLocations:)