第三章 3.2.10 dispatch_suspend / dispatch_resume

当追加大量处理到Dispatch Queue时,在追加处理的过程中,有时希望不执行已追加的处理,此时,

// 挂起指定Dispatch Queue
dispatch_suspend(queue);

// 恢复指定Dispatch Queue
dispatch_resume(queue);

注意:dispatch_suspend函数并不会将正在执行的处理停下来,只是将尚未执行的处理在此之后停止下来,恢复后这些处理就能够继续执行。

dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
//提交第一个block,延时5秒打印。
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:5];
    NSLog(@"五秒后打印,队列挂起时已经开始执行,");
});
//提交第二个block,也是延时5秒打印
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:5];
    NSLog(@"队列挂起时未执行,需恢复队列后在执行");
});
//延时一秒
NSLog(@"立刻打印~~~~~~~");
[NSThread sleepForTimeInterval:1];
//挂起队列
NSLog(@"一秒后打印,队列挂起");
dispatch_suspend(queue);
//延时10秒
[NSThread sleepForTimeInterval:10];
NSLog(@"十秒后打印,开启队列");
//恢复队列
dispatch_resume(queue);

输出:
2018-07-25 22:43:26.455332+0800 Demo[16856:598230] 立刻打印~~~~~~~
2018-07-25 22:43:27.456659+0800 Demo[16856:598230] 一秒后打印,队列挂起
2018-07-25 22:43:31.459096+0800 Demo[16856:598341] 五秒后打印,队列挂起时已经开始执行,
2018-07-25 22:43:37.458302+0800 Demo[16856:598230] 十秒后打印,开启队列
2018-07-25 22:43:42.464052+0800 Demo[16856:598342] 队列挂起时未执行,需恢复队列后在执行

从输入内容可以看出,在执行dispatch_suspend函数后,正在执行的两个处理没有立即被停止,也就是没有被立即挂起,这两个处理执行dispatch_suspend函数后也完成了执行。

你可能感兴趣的:(第三章 3.2.10 dispatch_suspend / dispatch_resume)