【发布时间】:2020-12-18 13:59:43
【问题描述】:
我必须保护我的代码的关键部分。 我不希望调用者被耗时的函数阻塞,所以我创建了一个带有后台 qos 的串行队列,然后异步调度:
private let someQueue = DispatchQueue(label: "\(type(of: self)).someQueue", qos: .background)
func doSomething() {
self.someQueue.async {
//critical section
}
}
据我了解,该函数将直接在调用线程上返回而不会阻塞。 我还看到某处首先在全局队列上异步调度,在串行队列上同步调度:
private let someQueue2 = DispatchQueue(label: "\(type(of: self)).someQueue2")
func doSomething() {
DispatchQueue.global(qos: .background).async {
self.someQueue2.sync {
//critical section
}
}
}
这两种方法有什么区别? 哪种方法是正确的?
【问题讨论】:
-
第二种形式似乎是一个没有意识到本地调度队列可以并发的人的误解。
-
你永远不应该在并发队列(全局队列是)中调用 dispatch_sync - 特别是当“关键部分”的执行时间可能很长时,因为这可能导致“线程爆炸”。 GCD 旨在让应用程序创建尽可能少的线程。所以,这实际上是一种“反模式”。所以,不同的是,方法 1 是可行的,方法 2 是错误的。
-
@CouchDeveloper 我同意你的观点,在遗留代码库中,我正在研究第一种方法在许多情况下都被使用,所以我质疑我的方法
标签: ios swift concurrency grand-central-dispatch