获取用户位置仅从第二次开始

时间:2019-01-09 11:36:30

标签: ios swift location cllocationmanager

首先:对不起,标题不好。我不知道如何更好地描述我的问题。

我的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,但这会导致相同的问题。

我在做什么错了?

2 个答案:

答案 0 :(得分:3)

问题在于位置更新是异步接收的,因此您要在新位置更新触发委托调用currentLocation并因此触发locationManager(_:, didUpdateLocations)变量之前打印currentLocation的值在更新之前已打印。您需要在委托方法中打印值以显示更新的值。

如果要接收单个位置更新,则不应该紧接着使用startUpdatingLocationstopUpdatingLocation,尤其是由于您可能实际上会在单个更新发生之前停止更新,原因是异步性。您应该使用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
}

它应该可以工作