GCD串行异步队列与嵌套在异步中的串行同步队列



我必须保护代码的关键部分。我不希望调用者被可能耗时的函数阻塞,所以我创建了一个具有后台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
}
}
}

这两种方法有什么区别?哪种方法是正确的?

在第一种方法中,调用线程不被阻塞,异步块中传递的任务(关键部分(将在后台执行。

在第二种方法中,调用线程不被阻塞,而是"阻塞";背景";线程将等待由另一个线程执行的同步块(关键部分(执行。

我不知道你在关键部分做了什么,但第一种方法似乎是最好的。请注意,后台qos非常慢,可能会对队列使用默认qos,除非您知道自己在做什么。还要注意,约定希望您使用bundle标识符作为队列的标签。这样的东西:

private let someQueue = DispatchQueue(label: "(Bundle.main.bundleIdentifier ?? "").(type(of: self)).someQueue")

最新更新