使用 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 数据?的主要内容,如果未能解决你的问题,请参考以下文章

将 alamofire 响应解析为 JSON 返回 nil

Json 解析 Swift 3 Alamofire

我的 JSON 解析失败

将 Alamofire NSData 解析为数组

比较 alamofire 返回的错误对象

iOS:从 Alamofire 解析的 SwiftyJSON 是一个数组。尝试解析时为空