我试图在 Swift 3 中以设定的时间间隔获取位置更新,但它 运行 每个时间间隔都是我的函数很多次,它应该只 运行 一次

I am trying to get updates on location with a set interval in Swift 3, but it runs my function a lot of times each interval, it should only run once

我正在使用 locationManager.startUpdatingLocation() 获取用户的位置,然后调用一个函数来处理我的所有逻辑,问题是它似乎被调用了多次,我不知道为什么。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    print("locations = \(locValue.latitude) \(locValue.longitude)")

    long = locValue.longitude
    lat = locValue.latitude

    if(self.arrayOfCellData.count > 0)
    {

        for i in 0...self.arrayOfCellData.count-1
        {
            getdistance(lat0: self.arrayOfCellData[i].shop.latitude!, long0: self.arrayOfCellData[i].shop.longitude!, lat1: locValue.latitude, long1: locValue.longitude)
            {distance in

                self.arrayOfCellData[i].meterstolocation = distance
            }
        }
        DispatchQueue.main.async {
            self.myTable.reloadData()
        }
    }
    print("stopped updating")
    locationManager.stopUpdatingLocation()
}

var run: Bool = true;

func updateLocations()
{
    if(run)
    {
        run = false;
    }
    else
    {
        locationManager.startUpdatingLocation()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
//

    locationManager.requestAlwaysAuthorization()
    //
    //
    //
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.pausesLocationUpdatesAutomatically = false
        locationManager.startUpdatingLocation()

        Timer.scheduledTimer(timeInterval: 10,
                             target: self,
                             selector: #selector(self.updateLocations),
                             userInfo: nil,
                             repeats: true)
    }

我的输出是:

locations = 37.33228724 -122.05833354
stopped updating
locations = 37.33228724 -122.05833354
stopped updating
locations = 37.33228724 -122.05833354
stopped updating
locations = 37.33228724 -122.05833354
stopped updating
locations = 37.33228724 -122.05833354

输出本身是正确的,但它一次吐出多个打印件。而且我不希望代码 运行 多次,每个间隔只有一次。

获取位置后不应调用locationManager.stopUpdatingLocation(),也不需要计时器。只需在开始时调用 locationManager.startUpdatingLocation() 一次,它就会自动向您发送更新,但仅在位置发生变化时。请参阅 https://developer.apple.com/reference/corelocation/cllocationmanager

处的文档