dispatch_suspend,dispatch_resume提供了“挂起、恢复”队列的功能,简单来说,就是可以暂停、恢复队列上的任务。但是这里的“挂起”,并不能保证可以立即停止队列上正在运行的block
// 挂起指定队列
dispatch_suspend(queue);
// 恢复指定队列
dispatchp_resume(queue);
dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
//提交第一个block,延时5秒打印。
dispatch_async(queue, ^{
sleep(5);
NSLog(@"After 5 seconds...");
});
//提交第二个block,也是延时5秒打印
dispatch_async(queue, ^{
sleep(5);
NSLog(@"After 5 seconds again...");
});
//延时一秒
NSLog(@"sleep 1 second...");
sleep(1);
//挂起队列
NSLog(@"suspend...");
dispatch_suspend(queue);
//延时10秒
NSLog(@"sleep 10 second...");
sleep(10);
//恢复队列
NSLog(@"resume...");
dispatch_resume(queue);
打印结果:
2016-08-20 21:17:19.872 GCDDemo[8469:1016194] sleep 1 second...
2016-08-20 21:17:20.873 GCDDemo[8469:1016194] suspend...
2016-08-20 21:17:20.874 GCDDemo[8469:1016194] sleep 10 second...
2016-08-20 21:17:24.878 GCDDemo[8469:1016441] After 5 seconds...
2016-08-20 21:17:30.876 GCDDemo[8469:1016194] resume...
2016-08-20 21:17:35.881 GCDDemo[8469:1016441] After 5 seconds again...
在dispatch_suspend挂起队列后,第一个block还是在运行,并且正常输出。
结论:
dispatch_suspend并不会立即暂停正在运行的block,而是在当前block执行完成后,暂停后续的block执行。