dispatch_once异步处理用法

Usage of dispatch_once usage for asynchronous processing

我对dispatch_once的用法很困惑。下面两个版本的代码可以给出相同的结果。使用dispatch_once有什么区别?

版本 1

static dispatch_queue_t downloadQueue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    downloadQueue = dispatch_queue_create("temp", 0);
});

版本 2

static dispatch_queue_t downloadQueue;
downloadQueue = dispatch_queue_create("dryapp", 0);
dispatch_once

没有那么大的区别,你可以看到有编程方法的方法。Here is the link可能对你阅读有帮助

这两个是完全不同的。第一个(dispatch_once)懒惰地实例化下载队列的一个实例。如果再次调用,dispatch_once 块将不会再次调用,只会在第一次调用时调用。当您想要确保您有一个且只有一个相关对象实例(在本例中为队列)时,这是一种非常有用的模式。

第二个模式(带有 static 变量并在第二行实例化)有 static 队列,但每次遇到第二行代码时,它都会实例化一个新队列(在实例化下一个时释放前一个。

第一个模式是您可能想要的模式,只实例化一次。