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