使用 SwiftyJSON 处理 Alamofire 异步请求

Posted

技术标签:

【中文标题】使用 SwiftyJSON 处理 Alamofire 异步请求【英文标题】:Handle Alamofire asynchronous request using SwiftyJSON 【发布时间】:2017-07-21 16:10:01 【问题描述】:

我正在尝试使用SwiftyJSONJSON 数据解析为一个数组以在我的TableView 中使用。但是,即使我可以成功请求数据并将其解析为数组,我也无法从 getObjects 函数返回它,因为它是异步完成的。我曾尝试使用完成处理程序,在学习了几个教程之后,我似乎遗漏了一些东西。

有人知道我如何返回数组以在我的 TableViewController 中使用吗?

表格视图控制器

let objects = [Objects]()

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    let urlString = "URLSTRING"
    objects = dataManager.getObjects(urlString)
    print("objects in view controller products array \(objects.count)")
    self.tableView.reloadData

请求函数

class DataManager 

    func requestObjects(_ stringUrl: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) 
        print("Request Data")
        Alamofire.request(stringUrl, method: .get).validate().responseJSON  response in
            switch response.result 
                case .success(let value):
                    let json = JSON(value)
                    print("responce success")
                    success(json)
                case .failure(let error):
                    print(error)
             //End of switch statement
         //End of alamofire request
      //End of request function

    func getObjects(_ urlString:String) -> [Object] 
        var objects = [Object]()

        requestObjects(urlString, success:  (JSONResponse) -> Void in
            let json = JSONResponse

            for item in json["items"] 
                let title = item.1["title"].string 
                objects.append(Object(title: title!))
            
            print("Number of objects = \(objects.count)")
        ) 
            (error) -> Void in
            print(error)
        
        print(objects)  // Prints empty array
        return objects // Array is empty
    

【问题讨论】:

【参考方案1】:

您需要使用completionHandler将数据返回给TableViewController。

func getObjects(completionHandler : @escaping ([Object]) -> (),_ urlString:String) -> [Sneaker] 
    var objects = [Object]()

    requestObjects(urlString, success:  (JSONResponse) -> Void in
        let json = JSONResponse

        for item in json["items"] 
            let title = item.1["title"].string 
            objects.append(Object(title: title!))
        
       completionHandler(objects)
        print("Number of objects = \(objects.count)")
    ) 
        (error) -> Void in
        print(error)
    
    print(objects)  // Prints empty array
    return objects // Array is empty

在您的 TableViewController 中

dataManager.getObject(completionHandler:  list in
        self.objects = list
    , urlString)

可能有一些我没有测试的语法错误

【讨论】:

以上是关于使用 SwiftyJSON 处理 Alamofire 异步请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftyJSON 处理 JSON 响应

在 SwiftyJSON 中处理可选元素的最佳方法是啥?

在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON

使用 SwiftyJSON 将 JSON 解析为结构

使用 SwiftyJSON 解析 JSON

SwiftyJson 无法设置值