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)
}
}
}
我正在尝试 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)
}
}
}