swift - Swift 4 中的多线程 for 循环
问题描述
我需要一些关于 swift 4 循环多线程的正确帮助。我应该使用普通的调度队列还是应该使用并发线程?还是我想错了?我在这里查看的具体实例是:假设我们想要对对象列表执行某些操作,例如从数据库中检索设备上本地数据库中缺少的所有用户的用户图片。
let utilityQueue = DispatchQueue(label: "com.company.utility", qos: .utility)
for i in 1 ... 10000 {
utilityQueue.async {
getMissingImage(user[i])
}
}
以上似乎对我有用,但我在阅读中找到了另一种选择,但使用如下并发
let concurrentQueue = DispatchQueue(label: "com.company.concurrent", attribute: .concurrent)
for i in 1 ... 10000 {
concurrentQueue.async {
getMissingImage(user[i])
}
}
哪个是正确的,或者有更好的方法来处理我错过的这个问题?
解决方案
尝试启动数量不受限制的并发任务是危险的,因为 GCD 的工作线程数量非常有限,如果耗尽它们,可能会对应用程序中的其他操作产生不利影响。
所以考虑你的例子:
let concurrentQueue = DispatchQueue(label: "com.company.concurrent", attributes: .concurrent)
for i in 0 ..< 10_000 {
concurrentQueue.async {
self.getMissingImage(self.user[i])
}
}
您可以使用OperationQueue
which 可以轻松地限制并发程度,在此示例中一次不超过 4 个:
let queue = OperationQueue()
queue.name = "com.company.concurrent"
queue.qualityOfService = .userInitiated
queue.maxConcurrentOperationCount = 4
for i in 0 ..< 10_000 {
queue.addOperation {
self.getMissingImage(self.user[i])
}
}
您可以使用 GCD 信号量完成类似的操作,但它有点脆弱,我建议上述方法。
请注意,这假定getMissingImage
同步运行(即在任务完全完成之前不会返回)。如果没有,你将不得不追求其他模式。
推荐阅读
- html - html type="number" : 在点之后总是显示 2 位数字?
- javascript - 是否有任何用于 React 的日期选择器允许自由格式化的自由输入以及日历选择器
- vb.net - ZXing 条码为 PDF417 条码抛出异常错误“无法将消息放入列中”
- python-3.x - Tesseract 找不到 eng.traineddata
- android - ARSceneView 不可用,是否必须手动创建?
- angular - 在组件 B Angular 中渲染组件 A
- javascript - 如何在使用 Google Apps 脚本填充某个单元格时自动填充当前时间和日期
- java - Eclipse 在自动完成时冻结
- reactjs - 实时 firebase 数据库获取 child_changed 上的属性名称和值
- bash - 如何将文件名提取为 2 部分,将一个放入目录,另一个放入其中?