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