swift - Swift 4 中的多线程 for 循环

标签 swift multithreading loops swift4 grand-central-dispatch

我需要一些关于 swift 4 的适当 for 循环多线程的帮助。我应该使用普通的调度队列还是应该使用并发线程?还是我在想这个错误?我在这里看到的具体实例是:假设我们要对对象列表执行某些操作,例如从数据库中检索设备本地数据库中缺少的所有用户的用户图片。

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,它可以让您轻松限制并发度,在此示例中一次不超过 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 同步运行(即在任务完全完成之前不会返回)。如果没有,您将不得不寻求其他模式。

关于swift - Swift 4 中的多线程 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833398/

相关文章:

java - Executors.newFixedThreadPool 挂起的线程

loops - 如何在 julia 中使用数组元素作为迭代器?

python - 如何迭代数据帧行,以更Pythonic的方式替换匹配元组中的值?

ios - 以编程方式约束

ios - 在 Swift 2 中获取 SSID

java - 如何防止线程在条件暂时不满足时被终止?

c# - 如何在不变得丑陋的情况下使方法可取消?

c++ - 如何将基于迭代器的 for 循环重写为基于范围的循环 (C++11)

swift - Xcode 12 Interface Builder 显示 “No selection”

ios - 如何重置初始 ViewController 的状态?