信号量:DISPATCH_TIME_NOW vs DISPATCH_TIME_FOREVER

dub*_*eat 0 grand-central-dispatch ios

有人可以提供一个例子,说明在使用信号量时何时使用DISPATCH_TIME_NOW vs DISPATCH_TIME_FOREVER?

2和我之间的区别是什么?

根据文档,DISPATCH_TIME_NOW表示立即超时.DISPATCH_TIME_FOREVER表示超时无限.

为什么你会想要前者,即:立即超时.

Dav*_*ist 6

您可以立即超时以检查块是否已完成计算.类似地,您可以永远等待,直到块完成,然后继续执行另一个块.

检查组是否完成的示例可能如下所示.

if (dispatch_group_wait(myDispatchGroup, DISPATCH_TIME_NOW) == 0) {
    // myDispatchGroup is finished... 
} else {
    // myDispatchGroup is _not_ finished...
}
Run Code Online (Sandbox Code Playgroud)

检查组是否在永远等待时完成没有意义,因为该功能将永远等待.相反,我们使用该功能同步阻止(阻塞,如暂停或等待,而不是像在GCD块中一样),直到组完成.

// Enqueue myDispatchGroup

// Wait for it to finish
dispatch_group_wait(myDispatchGroup, DISPATCH_TIME_FOREVER); 

// Do other work that depends on myDispatchGroup being completed
Run Code Online (Sandbox Code Playgroud)

  • 进行调用`dispatch_group_wait(myDispatchGroup,DISPATCH_TIME_FOREVER);`是正确的事情的情况很少.大多数时候这会阻止.阻止主线程是坏的,阻塞GCD线程(可能)是坏的.使用`dispatch_group_notify`排队一个块,在你的组完成时运行而不阻塞入队线程. (4认同)