Swift使用Alamofire

时间:2017-10-18 07:41:59

标签: ios swift

我刚开始使用Swift进行编程,并试图从我的API中获取一些结果,但据我所知,我不能简单地从函数返回,因为它是异步的。我正在使用Alamofire和SwiftyJSON。

 func getItems(completionHandler: @escaping ([Item], Error?) -> ()) {
        getData(url: API.getUrl, completionHandler: completionHandler)
    }

public func getData(url: URL, parameters: [String: AnyObject]? = nil, completionHandler: @escaping ([Item], Error?) -> ()) {
    Alamofire.request(url, method: .get)
        .responseJSON { response in
            switch response.result {
            case .success(let val):
                let json = JSON(val)
                if let array = json.array {
                    var itemArray: [Item] = []
                    for item in array {
                        guard let dictionary = item.dictionaryObject else {
                            continue
                        }
                        itemArray.append(item)
                    }
                    completionHandler(itemArray, nil)
                }
            case .failure(let error):
                print(error)
            }
    }
}

这是一个分离的类,我在其中执行这些操作,因此这个完成处理程序。我定义了一个简单的Item类,我希望在我的ViewController中获取一个数组(使用对象数组稍后填充表)。但是,它似乎不像这样工作?

var array = [Item]
let manager = APIManager()
APIManager.getItems(){ response in
    array = ...
}

这就是我的想法,但我不确定这是如何工作的。有什么想法吗?感谢所有帮助。

编辑:最初,这在completionhandler中使用了NSDictionary,它仍然在这里的代码中。我们的想法是返回一个对象数组

1 个答案:

答案 0 :(得分:1)

您将回调定义为([Item], Error?) -> (),因此您应将其用作:

var array = [Item]
let manager = APIManager()
APIManager.getItems() { items, error in
    array = items
    //and then you can reload tableview if it uses array as its source
}