我有这个简单的异步代码。
class MyClass {
func myFunc() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// some background work
dispatch_async(dispatch_get_main_queue()) {
// foreground work
}
}
}
}
我想知道,我们可以这样改写吗?
let background_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let main_queue = dispatch_get_main_queue()
class MyClass {
func myFunc() {
dispatch_async(background_queue) {
// some background work
dispatch_async(main_queue) {
// foreground work
}
}
}
}
声明(懒惰)缓存dispatch_get_global_queue()
或dispatch_get_main_queue()
结果并重用它们的全局变量。
显然它按预期工作,但因为我见过的所有代码都使用dispatch_async(dispatch_get_???_queue(
成语,我认为它可能不安全?
我想知道的是:这是否保证安全?
答案 0 :(得分:1)
是。对于给定的优先级,dispatch_get_main_queue()
和dispatch_get_global_queue()
将始终返回相同的队列。为方便起见,您可以自由保存这些值。在使用点调用dispatch_get_???_queue
是很常见的,但实际上并不是一个成语。通常没有任何理由来创建额外的变量。
来自dispatch_get_main_queue()
的文档:
返回与应用程序主线程关联的串行调度队列。
其中只有一个。
来自dispatch_get_global_queue()
的文档:
返回具有指定服务质量等级的系统定义的全局并发队列。
这在技术上并不承诺每个级别只有一个队列(尽管有),但这对全局队列无关紧要(因为你无法修改它们)。这些队列确实存在于整个程序运行中。