我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue。调用dispatch_suspend会增加queue的引用计数,调用dispatch_resume则减少queue的引用计数。当引用计数大于0时,queue就保持挂起状态。因此你必须对应地调用suspend和resume函数。挂起和继续是异步的,而且只在执行block之间(比如在执行一个新的block之前或之后)生效。挂起一个queue不会导致正在执行的block停止。
下面看代码:
1
2
3
4
5
6
7
8
9
10
|
dispatch_queue_t queue=dispatch_queue_create( "test" , DISPATCH_QUEUE_CONCURRENT); dispatch_suspend(queue); dispatch_async(queue, ^{ dispatch_apply(5, queue, ^(size_t index) { NSLog (@ "%ld 1" ,index); }); }); sleep(1); NSLog (@ "aa" ); dispatch_resume(queue); |
运行结果:
如果把线程挂起恢复取消之后:
1
2
3
4
5
6
7
8
9
|
dispatch_queue_t queue=dispatch_queue_create( "test" , DISPATCH_QUEUE_CONCURRENT); // dispatch_suspend(queue); dispatch_async(queue, ^{ dispatch_apply(5, queue, ^(size_t index) { NSLog (@ "%ld 1" ,index); }); }); NSLog (@ "aa" ); // dispatch_resume(queue); |
运行结果如下 :
可以看到:线程挂起时,添加到线程队列中的block并没执行,而且还将主线程休眠了1秒,取消线程挂起后才执行,而在第二个代码段中,没有使用线程挂起,可以看到并不会都是aa先输出。