Swift/Xcode6:"found nil unwrapping optional" 我用户的位置

Swift/Xcode6: "found nil unwrapping optional" for my user's location

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

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

为什么会这样? swift 是否在实际找到之前以某种方式检查位置?

提前致谢。

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")

    }

我的猜测是您正在尝试使用线性过程从异步服务中检索数据。

正如这一行所暗示的那样:

manager.startUpdatingLocation()

管理员正在开始更新位置,但这并不意味着returns已经获得了位置。它可能需要一些时间,也可能会失败。

读取位置的正确位置在CLLocationManagerDelegatedidUpdateLocations方法中,我想你已经在视图控制器中设置了。

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

更新

一种可能的解决方法是:

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