【问题标题】:didUpdateLocations only can called oncedidUpdateLocations 只能调用一次
【发布时间】:2018-06-04 12:52:34
【问题描述】:
func startLocationManager() {
        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
            locationManager.startUpdatingLocation()
        }
}

获得位置授权后,我在viewDidLoad()中调用了这个方法,然后func locationManager(_:, didUpdateLocations:)开始被调用。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let lastLocation = locations.last!

    if lastLocation.timestamp.timeIntervalSinceNow < -5 {
        return
    }
    if lastLocation.horizontalAccuracy < 0 {
        return
    }

    var distance = CLLocationDistance(Double.greatestFiniteMagnitude)

    if let location = location {
        distance = lastLocation.distance(from: location)
    }

    if location == nil || location!.horizontalAccuracy > lastLocation.horizontalAccuracy {
        location = lastLocation
        if location.horizontalAccuracy <= locationManager.desiredAccuracy {

            stopLocationManager()

            getWeather()
        }
    } else if location == nil || distance < 1 {
        let timeInterval = lastLocation.timestamp.timeIntervalSince(location!.timestamp)
        if timeInterval > 5 {
            stopLocationManager()
            getWeather()
        }
    }
}

这就是我结束 updateLocation 的方式:

func stopLocationManager() {
        locationManager.stopUpdatingLocation()
        locationManager.delegate = nil
}

终于,我完美地得到了我想要的位置数据。

但是当我想通过其他方式重新获取新位置时,即已经执行locationManager.startUpdatingLocation(),仍然无法执行func locationManager(_:, didUpdateLocations:)

我想知道如何解决这个问题。

【问题讨论】:

  • 可能与您的问题无关,但您无需在每次调用stopUpdatingLocation 时都重置委托,因为调用此函数后将不会调用委托方法。另外,您确定不满足可能停止更新的if 条件,因此您不会在启动后立即调用stopLocationManager

标签: swift location cllocationmanager


【解决方案1】:

当您停止更新您的位置时,请勿设置locationManager.delegate = nil。或者,如果您这样做了,当您想再次开始获取位置更新时,将其设置回 self。

【讨论】:

  • 实际上 OP 正在将代理设置回func startLocationManager() { if CLLocationManager.locationServicesEnabled() { locationManager.delegate = self,所以这应该是问题的原因。
  • 实际上没有必要每次都设置/清除委托。我建议不要这样做,因为这又是一件可能会搞砸的事情。
  • 我也绝对反对这一点,因为它没有提供任何好处,但显然会导致麻烦被滥用。我只是想指出其他原因可能是问题的原因。
  • 没有效果。
【解决方案2】:

删除这个

locationManager.delegate = nil

【讨论】:

  • 实际上 OP 正在将代理设置回func startLocationManager() { if CLLocationManager.locationServicesEnabled() { locationManager.delegate = self,所以这应该是问题的原因。
  • 他没有调用 startLocationManager ,他调用了 locationManager 的 startUpdatingLocation 方法,它不会重做委托
  • 如果没有 MCVE,我们无法真正知道这一点,因为问题中没有代码显示 UP 如何重新启动位置更新。
  • 没有效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2015-11-28
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多