完成处理程序异步
问题描述:
我的完成处理程序有问题。下面是完成处理的功能,位于实用程序文件:完成处理程序异步
func convertGeopointToCity(geopoint: PFGeoPoint, complete: (city: String, error: NSError?) -> Void) {
var city = ""
let latitude = geopoint.latitude
let longitude = geopoint.longitude
let location: CLLocation = CLLocation(latitude: latitude, longitude: longitude)
CLGeocoder().reverseGeocodeLocation(location, completionHandler: { placemarks, error in
if (error == nil) {
if let p = CLPlacemark?(placemarks![0]) {
if let city = p.locality {
city = " \(city)!"
print("Here's the city:\(city)")
complete(city: city, error: nil)
}
}
}
})
}
,我称之为一个视图控制器
LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in
if error != nil {
print("error converting geopoint")
} else {
city = result as String
}
})
print("The city: \(city)")
输出清楚地表明,该函数不等待运行前完成该块:
The city:
Here's the hood Toronto!
如何解决此问题?
答
你应该把你的处理程序块内:
LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in
if error != nil {
print("error converting geopoint")
} else {
city = result as String
// do other stuff here, or call a method
print("The city: \(city)")
}
})
的CLGeocoder().reverseGeocodeLocation
是异步。一旦地理编码完成,就会调用完成块,更有可能在您的打印附加之后。
您应该在完整块调用的另一个函数中执行操作,或者向块本身添加一些代码。
按预期工作。工作完成后立即调用完成处理程序。当这项工作完成后,定期的控制流程将继续 - 在你的情况下,这意味着执行了print语句。 –