在循环中一次执行一个异步方法,Swift 4

和异常

我需要在执行下一个 (i + 1) 之前完成 performAsyncRequests-methods(对于每个 i)。我正在尝试这个:

let group = DispatchGroup()
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1

for i in 0..<results.count {
    group.enter()
    print("\(i)-async started")
    queue.addOperation {
        print("Operation \(i) added")
        self.performAsyncRequests(completion: { (result) in
            print("Request \(i) completed")
            group.leave()
        })
    }
}
group.notify(queue: .main) {
    print("All requests completed")
    self.reloadTableView()
}

但这会同时执行多个请求。感谢有人能指出我正确的方向。

最简单的解决方案是编写一个递归执行请求的例程,例如:

func performNextRequest(_ index: Int = 0) {
    guard index < results.count else {
        DispatchQueue.main.async {
            // initiate whatever you want when this is done
            self.reloadTableView()
        }
        return
    }

    performAsyncRequest(index) { [weak self] in
        self?.performNextRequest(index + 1)
    }
}

更优雅的解决方案是使用一些异步模式,例如异步Operation子类或承诺。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何一次迭代4个切片

一次初始化4个CGFloat

Bootstrap 4 Carousel一次多帧,然后滑动一个

如何在Swift4中一次转换字典键和值?

Swift 4:创建一个异步串行队列,每个作业后等待2秒

一次处理4个循环?

如何使CAEmitterLayer一次仅生成一个单元格迅速4

在F#中一次执行一个异步可观察

在Javascript中一次通过4个元素的集合循环遍历一个数组?

如何一次下载4个文件

在各种循环中追加到同一数组,仅保留最后一个值Bash 4

循环应运行4次,但只能执行一次

Propel:如何在一个循环中一次从数据库中检索所有元素?

Laravel 4 foreach循环中的第一个奇怪结果

在第一个循环的for循环中一次显示文本

是否可以一次将3个行中的4个文件分开一个文件?

如何使一个随机数生成器一次只打印4个随机数?

循环执行一次查询4次

如何在Netbeans中一次退格4个空间?

查找第一个非重复字符算法 Swift 4(仅循环一次字符串)

在 Bootstrap 4 中垂直居中一个 div

在 Angular 4 循环中为一个元素设置动画

使用 Corona SDK 在循环中一次仅选择一个矩形

一次重塑 4 个变量 R

asyncio 中的事件循环溢出。虽然一次添加 4 个执行,但它是超载的

一次将 4 个 div(从 div 列表中)附加到一个单独的 div

Bootstrap 4:在 foreach 循环中将一个图标与另一个图标交换的最佳方法是什么?

如何在无限循环中一次显示一个容器中的数组对象?

在一个循环中,如何在语句为真时执行一次,然后在再次为真时再次执行一次?