我刚开始使用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,它仍然在这里的代码中。我们的想法是返回一个对象数组
答案 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
}