当前位置:  开发笔记 > 编程语言 > 正文

SWIFT - LocationManager循环多次?

如何解决《SWIFT-LocationManager循环多次?》经验,为你挑选了1个好方法。



1> Rob..:

我首先建议一些事情:

    stopUpdatingLocation在表演之前打电话reverseGeocodeLocation.

    您正在完成处理程序关闭stopUpdatingLocation内部调用reverseGeocodeLocation.问题在于它以异步方式运行,因此didUpdateLocations可能在中间期间接收额外的位置更新.通常,当您第一次启动位置服务时,您将获得许多更新,通常会提高准确性(例如,horizontalAccuracy值越来越小).如果在启动异步地理编码请求之前关闭位置服务,则可以最大限度地减少此问题.

    您还可以添加添加distanceFilterviewDidLoad,将尽量减少对委托方法重复的调用:

    locationManager.distanceFilter = 1000
    

    您可以使用自己的状态变量来检查是否已启动反向地理编码过程.例如:

    private var didPerformGeocode = false
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        // if we don't have a valid location, exit
    
        guard let location = locations.first where location.horizontalAccuracy >= 0 else { return }
    
        // or if we have already searched, return
    
        guard !didPerformGeocode else { return }
    
        // otherwise, update state variable, stop location services and start geocode
    
        didPerformGeocode = true
        locationManager.stopUpdatingLocation()
    
        CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in
            let placemark = placemarks?.first
    
            // if there's an error or no placemark, then exit
    
            guard error == nil && placemark != nil else {
                print(error)
                return
            }
    
            let city = placemark?.locality ?? ""
            let state = placemark?.administrativeArea ?? ""
    
            self.navigationBar.title = ("\(city), \(state)")
            self.usersLocation = ("\(city), \(state)")
            print(self.usersLocation)
            self.refreshPosts()
        }
    }
    

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有