ios - 循环函数中的异步调用。仅在异步完成时返回

标签 ios swift3 closures alamofire

我有一个 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/

相关文章:

ios - 后退按钮从屏幕上消失

ios - 使用sharedmanager后的警报

swift2 - 'init'是该类型的成员;使用'type(of: …)'初始化一个新对象

html - 如何在 Safari 上打开本地 html 文件?

C++0x 闭包/lambda 示例

ios - 如何在 Twitter API 中隐藏来自 TimeLine 的推文

ios - ios中如何知道相机拍照完成

javascript - 了解 JavaScript 闭包 - 卡住传递给回调的变量

ios - 单元格未出现在 UITableView 中 - Swift 3

methods - 不允许部分应用协议(protocol)方法