使用 Alamofire 返回解析的 JSON 数据?
Posted
技术标签:
【中文标题】使用 Alamofire 返回解析的 JSON 数据?【英文标题】:Returning parsed JSON data using Alamofire? 【发布时间】:2021-06-04 15:44:30 【问题描述】:您好,Swift 和 Alamofire 的新手,
我遇到的问题是,当我调用 fetchAllUsers() 时,代码将返回空的 users 数组,执行完成后,它将进入 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
【问题讨论】:
是的,你是对的。 @TusharSharma 有没有办法在 alamo 上禁用异步,或者我是以错误的方式处理这个问题 您正在进行异步网络调用,需要一些时间才能返回结果。因此,您不希望您的应用程序被卡住这么长时间并造成糟糕的用户体验。 Async 将在启动后直接调用 return 语句,并返回对主线程的调用。同时,您的 API 调用在后台线程中运行,并且一旦完成调用,就如您所见,将进入闭包块。我建议你也看看@escaping 闭包。 @TusharSharma 谢谢 【参考方案1】:您需要以某种方式处理异步。这意味着为您需要的类型传递一个完成处理程序。其他时候,这意味着您将其包装在其他异步结构中,例如 Promise 或发布者(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]
值,否则您会错过任何发生的错误。
【讨论】:
我将使用@TusharSharma 使用转义闭包作为参数的解决方案。调用此函数并在我的 viewModel 中创建数组以上是关于使用 Alamofire 返回解析的 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章