首先:对不起,标题不好。我不知道如何更好地描述我的问题。
我的Xcode项目中有以下代码:
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var currentLocation = "PLACEHOLDER"
override func viewDidLoad() {
self.locationManager.requestWhenInUseAuthorization()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
super.viewDidLoad()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
currentLocation = String(locValue.latitude)
}
@IBAction func sendLocation() {
locationManager.startUpdatingLocation()
print(currentLocation)
locationManager.stopUpdatingLocation()
}
}
这将在单击UIButton时打印用户位置。
这正在工作。但是由于某些原因,在重新启动应用程序后首次按下UIButton时,它将打印PLACEHOLDER
而不是位置。
方法:当我启动应用程序并单击UIButton三次时,我正在控制台中找到它:
PLACEHOLDER
56.153666216328625
56.153666216328625
代替此:
56.153666216328625
56.153666216328625
56.153666216328625
我还尝试存储为UserDefaults
而不是var
,但这会导致相同的问题。
我在做什么错了?
答案 0 :(得分:3)
问题在于位置更新是异步接收的,因此您要在新位置更新触发委托调用currentLocation
并因此触发locationManager(_:, didUpdateLocations)
变量之前打印currentLocation
的值在更新之前已打印。您需要在委托方法中打印值以显示更新的值。
如果要接收单个位置更新,则不应该紧接着使用startUpdatingLocation
和stopUpdatingLocation
,尤其是由于您可能实际上会在单个更新发生之前停止更新,原因是异步性。您应该使用requestLocation
来接收一次位置更新。此外,您应该在委托调用中使用locations
变量,而不是manager.location
。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let coordinate = locations.last?.coordinate else { return }
currentLocation = String(coordinate.latitude)
print(currentLocation)
}
@IBAction func sendLocation() {
locationManager.requestLocation()
}
答案 1 :(得分:0)
位置更新是异步发送给您的,因此您不能在调用startUpdatingLocation()之后立即打印currentLocation。
只需将打印内容放入委托人
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
currentLocation = String(locValue.latitude)
print(currentLocation) // print only after updating the location
}
它应该可以工作