重用dispatch_get_main_queue()/ dispatch_get_global_queue()的结果是安全的吗?

时间:2014-10-07 18:34:24

标签: ios objective-c macos asynchronous swift

我有这个简单的异步代码。

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(成语,我认为它可能不安全?

我想知道的是:这是否保证安全?

1 个答案:

答案 0 :(得分:1)

是。对于给定的优先级,dispatch_get_main_queue()dispatch_get_global_queue()将始终返回相同的队列。为方便起见,您可以自由保存这些值。在使用点调用dispatch_get_???_queue是很常见的,但实际上并不是一个成语。通常没有任何理由来创建额外的变量。

来自dispatch_get_main_queue()的文档:

  

返回与应用程序主线程关联的串行调度队列。

其中只有一个。

来自dispatch_get_global_queue()的文档:

  

返回具有指定服务质量等级的系统定义的全局并发队列。

这在技术上并不承诺每个级别只有一个队列(尽管有),但这对全局队列无关紧要(因为你无法修改它们)。这些队列确实存在于整个程序运行中。