Alamofire 的 CompletionHandler

CompletionHandler for Alamofire

我正在尝试 return responseJSON

static func getAllPersons(completionhandler:@escaping (Any) -> ()){
    let URL = baseURL + "api/person"
    Alamofire.request(URL).responseJSON {
        response in
        completionhandler(response.result.value as Any)
    }
}

但如果我尝试将 responseJSON 存储在 "res" 中,它将不起作用:

var res: Any = ""
PersonResource.getAllPersons{ (result) in
    res = result
}
print(res)

此致

var res: Any = ""
PersonResource.getAllPersons{ (result) in
    res = result
    print(res)
}

在里面放print语句会打印出结果

为什么?

PersonResource.getAllPersons 是异步调用,因此 print(res) 甚至在 PersonResource.getAllPersons 的完成块执行并设置 res

之前就已执行

response.result.value 是可选的,所以请尝试 return Any?。但这是更好的方法:

static func getAllPersons(completionhandler:@escaping ([String: Any]?, Error?) -> ()){
    let URL = baseURL + "api/person"
    Alamofire.request(URL).responseJSON {
        response in
        if let json = response.result.value as? [String: Any] {
                completionhandler(json, nil)
        }
        else if let error = response.result.error as Error? {
                completionHandler(nil, error)
        }
    }
}