BOOL与dispatch_once_t

时间:2014-10-22 17:52:16

标签: objective-c boolean

所以我不确定它是属于这里还是属于“Code Review”,但我认为这更像是一个问题比什么都重要所以我决定在这里发布。

我正在阅读dispatch_once_tdispatch_once(),我不禁想到......

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //do stuff
});

是...

的过于复杂的陈述
static BOOL ranOnce = NO;
if (!ranOnce) {
    //do stuff
    ranOnce = YES;
}

我的问题是,使用其中一个有什么好处?如果是这样,我应该在什么情况下使用什么?

2 个答案:

答案 0 :(得分:1)

第一个在多线程环境中工作。

对于第二个,请考虑如果两个线程在其中一个线程到达if (!ranOnce) {之前到达ranOnce = YES;会发生什么。

答案 1 :(得分:1)

前者即使在多线程环境中也能正常工作。如this blog post中所述:

  

在单线程世界中,这个调用会很无聊,可以用简单的if语句替换。但是,我们生活在一个多线程的世界中,dispatch_once是线程安全的。保证从多个线程多次同时调用dispatch_once只执行一次块,所有线程将等到执行完成dispatch_once之前。即使这不是很难自己完成,但是dispatch_once也非常快,而且这很难实现。