在Swift中的asynchronous调用中包含一个返回处理程序

我正在尝试asynchronous呼叫,但我有点失落。 viewDidLoadprint(json)输出一个空的字典,但是函数内的那个打印正确。 这并不令人惊讶; 在asynchronous完成之前它会打印出来。 我无法弄清楚如何解决这个问题。 我试图把完成处理程序内的返回,但我得到了一个错误, Unexpected non-void return value in void functionUnexpected non-void return value in void function 。 我试图改变完成处理程序期望返回值,但要么这不是正确的做法,或者我做错了。

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let json = getJson("https://maps.googleapis.com/maps/api/geocode/json?address=WashingtonDC&sensor=false") print(json) } func getJson(url: String) -> AnyObject { var json:AnyObject = [:] let urlPath = NSURL(string: url) let urlRequest = NSURLRequest(URL: urlPath!) let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config) let task = session.dataTaskWithRequest(urlRequest, completionHandler: { (data, response, error) in if error != nil { print("Error") } else { do { json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) print(json) } catch { print("json error") } } }) task.resume() return json } } 

您将需要有一个基于完成处理程序的接口到您的asynchronousAPI。

 func getJson(url: String, completion : (success: Bool, json: AnyObject? ) ->Void ) -> Void { var json:AnyObject = [:] let urlPath = NSURL(string: url) let urlRequest = NSURLRequest(URL: urlPath!) let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config) let task = session.dataTaskWithRequest(urlRequest, completionHandler: { (data, response, error) in if error != nil { print("Error") } else { do { json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) print(json) //Call the completion handler here: completion(success : true, json :json ) } catch { print("json error") completion(success : false, json :nil ) } } }) task.resume() } } 

现在你打电话给这个API如下 –

  override func viewDidLoad() { super.viewDidLoad() getJson("https://maps.googleapis.com/maps/api/geocode/json?address=WashingtonDC&sensor=false") { (success, json) -> Void in if success { if let json = json { print(json) } } } }