使用 Alamofire 返回已解析的 JSON 数据?
Returning parsed JSON data using Alamofire?
你好,Swift 和 Alamofire 的新手,
我遇到的问题是,当我调用此 fetchAllUsers() 时,代码将 return 空用户数组,在执行完成后,它将进入 AF.request 闭包并执行休息。
我做了一些研究,我想知道这是不是因为 Alamofire 是一个异步函数。
有什么建议吗?
func fetchAllUsers() -> [User] {
var users = [User]()
let allUsersUrl = baseUrl + "users/"
if let url = URL(string: allUsersUrl) {
AF.request(url).response { response in
if let data = response.data {
users = self.parse(json: data)
}
}
}
return users
}
您需要以某种方式处理异步。这意味着为您需要的类型传递完成处理程序。其他时候,这意味着您将其包装在其他异步结构中,例如 promises 或发布者(Alamofire 也提供)。
在你的情况下,我建议你 User
键入 Decodable
并允许 Alamofire 为你解码。
func fetchAllUsers(completionHandler: @escaping ([User]) -> Void) {
let allUsersUrl = baseUrl + "users/"
if let url = URL(string: allUsersUrl) {
AF.request(url).responseDecodable(of: [User].self) { response in
if let users = response.value {
completionHandler(users)
}
}
}
}
但是,我建议从响应中返回完整的 Result
而不仅仅是 [User]
值,否则您会错过任何发生的错误。
你好,Swift 和 Alamofire 的新手,
我遇到的问题是,当我调用此 fetchAllUsers() 时,代码将 return 空用户数组,在执行完成后,它将进入 AF.request 闭包并执行休息。
我做了一些研究,我想知道这是不是因为 Alamofire 是一个异步函数。
有什么建议吗?
func fetchAllUsers() -> [User] {
var users = [User]()
let allUsersUrl = baseUrl + "users/"
if let url = URL(string: allUsersUrl) {
AF.request(url).response { response in
if let data = response.data {
users = self.parse(json: data)
}
}
}
return users
}
您需要以某种方式处理异步。这意味着为您需要的类型传递完成处理程序。其他时候,这意味着您将其包装在其他异步结构中,例如 promises 或发布者(Alamofire 也提供)。
在你的情况下,我建议你 User
键入 Decodable
并允许 Alamofire 为你解码。
func fetchAllUsers(completionHandler: @escaping ([User]) -> Void) {
let allUsersUrl = baseUrl + "users/"
if let url = URL(string: allUsersUrl) {
AF.request(url).responseDecodable(of: [User].self) { response in
if let users = response.value {
completionHandler(users)
}
}
}
}
但是,我建议从响应中返回完整的 Result
而不仅仅是 [User]
值,否则您会错过任何发生的错误。