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
立即更新变量的原因。
我的问题是,如何让这些变量立即更新?提前谢谢。
答案 0 :(得分:1)
您不能立即更新这些变量,因为您正在调用异步函数。这是一个明显的矛盾: - )
您调度回主队列很好,但这不会改变异步行为。实际上你甚至发布了另一个dispatch_async
...(意味着该代码的主体将在稍后的某个时间运行)
您可以等待结果可用,例如使用dispatch group,但很可能这不是你想要的。 我假设你想在一些视图控制器中使用这些值?在这种情况下,您可能会在结果到达时填写一些实例变量,并在两个值都可用时更新UI状态。
答案 1 :(得分: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)
}
现在,当您调用函数时,请更新变量startLat
和startLong
,如下所示:
forwardGeocodingStarting(<your string address>) { firstVar, secondVar in
startLat = firstVar
startLong = secondVar
print("\(startLat) is lat and \(startLong) is long") //You will get correct values
}