2013-07-30 49 views
0

可有人请我提供的,当你将使用信号量时使用DISPATCH_TIME_NOW VS DISPATCH_TIME_FOREVER的例子吗?信号灯:DISPATCH_TIME_NOW VS DISPATCH_TIME_FOREVER

是什么2之间和我会用什么情况下,一个比其他的区别?

按照文档DISPATCH_TIME_NOW装置立即暂停。 DISPATCH_TIME_FOREVER表示超时无限。

为什么你想前者,即:立即暂停。

+3

您是指DISPATCH_TIME_NOW与DISPATCH_TIME_FOREVER? –

+0

呃,对不起。这是一个错字。现在更正 – dubbeat

回答

4

您可以立即超时检查,如果一个块已完成计算。同样,您可以永久等待,直到完成一个块,然后继续执行另一个块。

如果一组完成看起来是这样的检查的一个例子。

if (dispatch_group_wait(myDispatchGroup, DISPATCH_TIME_NOW) == 0) { 
    // myDispatchGroup is finished... 
} else { 
    // myDispatchGroup is _not_ finished... 
} 

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

// Enqueue myDispatchGroup 

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

// Do other work that depends on myDispatchGroup being completed 
+1

可以公平地说,DISPATCH_TIME_FOREVER用于组创建,而DISPATCH_TIME_NOW用于组查询? – dubbeat

+1

我不会说群体“创造”,因为等待永远做的一件很常见的事情是使用'dispatch_release(group);'释放群体。我会称之为组依赖关系。 –

+4

使调用“dispatch_group_wait(myDispatchGroup,DISPATCH_TIME_FOREVER);'是正确的做法的情况数量非常小。大多数时候这会阻止。阻塞主线程不好,阻塞GCD线程(可能)不好。使用'dispatch_group_notify'排队一个块,当你的组完成而不阻塞排队线程时运行。 – ipmcc