[swift]不更新变量的异步函数

标签: ios Swift
发布时间: 2017/3/6 23:32:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
        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 来立即更新变量。

我的问题是,如何能有立即更新这些变量吗?在此先感谢。

解决方法 1:

你应该与你是什么意思有点混淆 "Asynchronous function not updating variable"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

}
赞助商