我有一个 Alamofire 调用,我在其中获取项目列表,然后解析它们:
class func getList(_ completion:@escaping (Array<Item>) -> Void) {
Alamofire.request("http://foo.com", method: .get, parameters: nil, headers: nil)
.responseJSON { response in
let list = parseList(response as! NSArray)
completion(list)
}
}
当我解析列表时,我需要再次调用以获取项目的状态:
class func parseList(_ responseArray: NSArray) -> Array<Item> {
let list = NSMutableArray()
for itemDic in responseArray {
let item = Item()
item.id = itemDic.value(forKey: "Id") as? Int
item.name = itemDic.value(forKey: "Name") as? Int
Alamofire.request("http://bar.com", method: .get, parameters: nil, headers: nil)
.responseJSON { response in
item.status = response as? String
}
list.add(item)
}
return list as NSArray as! Array<Item>
}
主要问题是我需要在第一个 func 完成之前拥有所有项目状态,现在当循环已经返回数组时我得到一些状态响应。返回带状态的解析列表的最佳解决方案是什么?
最佳答案
将解析函数更改为闭包并添加 DispatchGroup 直到设置所有状态。
第一个函数:
class func getList(_ completion:@escaping (Array<Item>) -> Void) {
Alamofire.request("http://foo.com", method: .get, parameters: nil, headers: nil)
.responseJSON { response in
self.parseList(response as! NSArray, completion: { (list) in
completion(list)
})
}
}
第二个功能:
class func parseList(_ responseArray: NSArray, completion:@escaping(Array<Item>) - Void) {
let dispatch = DispatchGroup()
let list = NSMutableArray()
for itemDic in responseArray {
let item = Item()
item.id = itemDic.value(forKey: "Id") as? Int
item.name = itemDic.value(forKey: "Name") as? Int
dispatch.enter()
Alamofire.request("http://bar.com", method: .get, parameters: nil, headers: nil)
.responseJSON { response in
item.status = response as? String
dispatch.leave()
}
list.add(item)
}
dispatchGroup.notify(queue: DispatchQueue.main) {
completion(list as NSArray as! Array<Item>)
}
}
关于ios - 循环函数中的异步调用。仅在异步完成时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41037454/