ios - 异步函数不更新变量

标签 ios swift

        var endLat: Double = 0.0
        var endLong: Double = 0.0

              func forwardGeocodingStarting(address: String) {
            CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
                if error != nil {
                    print(error)
                    return
                }

                let placemark = placemarks?[0]
                let location = placemark?.location
                let coordinate = location?.coordinate

                dispatch_async(dispatch_get_main_queue()) {
                    startLat = (coordinate?.latitude)!
                    startLong = (coordinate?.longitude)!
                    print("\(startLat) is lat and \(startLong) is long")
                }
            })
        }

您好,这是我创建的一个地理编码函数,它只需要一个地址并返回地址的坐标。我的问题是,在代码部分的末尾,当我执行 print(endLat) 时,它打印出 0,但是当我在函数的 dispatch_async 中执行时, 它出现在适当的纬度上。

我意识到这是一个异步函数,这就是为什么我尝试使用 dispatch_async 来立即更新变量。

我的问题是,如何让这些变量立即更新?提前致谢。

最佳答案

您对“异步函数不更新变量” 的含义有点困惑。 forwardGeocodingStarting(_:) 不是 异步函数。 geocodeAddressString 是 API 设计的异步函数,允许您使用仅在该函数内完成操作后获得的以下 values。因此你一直得到 0 因为它不会等到操作完全完成才显示值。 dispatch_async(dispatch_get_main_queue) 仅用于在主线程上更新 UI。您必须像这样在函数中使用完成处理程序:

 typealias theDouble = (Double, Double) -> ()  

 func forwardGeocodingStarting(address: String, completion: theDouble){
//your code
let aVar: Double!
let bVar: Double!

let placemark = placemarks?[0]
let location = placemark?.location
let coordinate = location?.coordinate
aVar = (coordinate?.latitude)!
bVar = (coordinate?.longitude)!
completion(aVar, bVar)
}

现在,当您调用函数时,更新变量 startLatstartLong,如下所示:

forwardGeocodingStarting(<your string address>) { firstVar, secondVar in

startLat = firstVar
startLong = secondVar
 print("\(startLat) is lat and \(startLong) is long") //You will get correct values

}

关于ios - 异步函数不更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38556307/

相关文章:

ios - 钛加速器 : Links/Images in Labels/TextArea - Open in WebView

ios - 如何在 Objective-C 中测试字符串是否为空?

objective-c - 在 UITabBarController 中为 Xcode Storyboard Segue 设置标识符,并获取指向其 View Controller 的指针

ios - SWIFT 的核心数据 : How to delete object from Relationship entity?

swift - 将 SVG 字符串加载到 UIImage (Swift)

ios - Afnetworking post 请求的代码提取

ios - Try and catch 不抛出消息并处理问题

ios - 将 UIPageViewController 滑动与 iOS 7 UINavigationController 向后滑动手势相结合

ios - RxSwift 和 UICollectionView header

php - Swift Php Json 汉字