使用SwiftyJSON处理Alamofire异步请求

时间:2017-07-21 16:10:01

标签: json swift alamofire swifty-json

我正在尝试使用JSONSwiftyJSON数据解析为一个数组,以便在我的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 个答案:

答案 0 :(得分: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)

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