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已经获得了位置。它可能需要一些时间,也可能会失败。
读取位置的正确位置在CLLocationManagerDelegate
的didUpdateLocations
方法中,我想你已经在视图控制器中设置了。
你第二次使用它的原因是因为在之前 运行 经理确实有时间检测位置,所以你得到的是旧的,而不是一个最新的位置。
更新
一种可能的解决方法是:
- 在
viewDidLoad
中检查 userLocation.coordinate
是否不为零(它是一个隐式解包的可选,所以你可以进行检查)
- 如果为零,开始更新位置,添加
UIActivityIndicator
,可能会禁用用户输入,并将标志(实例 属性)设置为 true,以跟踪您正在等待的一个地点
- 等待在
locationManager(_:didUpdateLocations:)
中获取位置
- 在该方法中,检查标志是否为真,如果是,取消设置,删除进度视图并重新启用用户输入,然后调用
queryForTable
所以我遇到了一个奇怪的错误 - "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已经获得了位置。它可能需要一些时间,也可能会失败。
读取位置的正确位置在CLLocationManagerDelegate
的didUpdateLocations
方法中,我想你已经在视图控制器中设置了。
你第二次使用它的原因是因为在之前 运行 经理确实有时间检测位置,所以你得到的是旧的,而不是一个最新的位置。
更新
一种可能的解决方法是:
- 在
viewDidLoad
中检查userLocation.coordinate
是否不为零(它是一个隐式解包的可选,所以你可以进行检查) - 如果为零,开始更新位置,添加
UIActivityIndicator
,可能会禁用用户输入,并将标志(实例 属性)设置为 true,以跟踪您正在等待的一个地点 - 等待在
locationManager(_:didUpdateLocations:)
中获取位置
- 在该方法中,检查标志是否为真,如果是,取消设置,删除进度视图并重新启用用户输入,然后调用
queryForTable