【问题标题】:Handle Alamofire asynchronous request using SwiftyJSON使用 SwiftyJSON 处理 Alamofire 异步请求
【发布时间】: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
    }
}

【问题讨论】:

    标签: json swift alamofire swifty-json


    【解决方案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)
    

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

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2015-07-03
      • 2014-12-27
      • 2015-07-23
      • 2019-07-18
      • 2018-03-28
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多