在GCD中dispatch_suspend和dispatch_resume提供了“挂起、恢复”队列的功能,简单来说,就是可以暂停、恢复队列上的任务。但是这里的“挂起”,并不能保证可以立即停止队列上正在运行的block,未执行的block会被“挂起”。
dispatch_suspend(queue) //暂停某个队列 dispatch_suspend挂起指定的dispatch_queue
dispatch_resume(queue) //恢复某个队列 dispatch_resume恢复指定的dispatch_queue
/*
dispatch_suspend会挂起dispatch queue,但并不意味着当前正在执行的任务会停下来,这只会导致不再继续执行还未执行的任务。
dispatch_resume会唤醒已挂起的dispatch queue。你必须确保它们成对调用。
*/
代码执行
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);
打印结果:
2017-05-04 16:22:57.279 Practice_Animation[2234:1740974] 立刻打印~~~~~~~
2017-05-04 16:22:58.281 Practice_Animation[2234:1740974] 一秒后打印,队列挂起
2017-05-04 16:23:02.284 Practice_Animation[2234:1742180] 五秒后打印,队列挂起时已经开始执行,
2017-05-04 16:23:08.283 Practice_Animation[2234:1740974] 十秒后打印,开启队列
2017-05-04 16:23:13.288 Practice_Animation[2234:1742717] 队列挂起时未执行,需恢复队列后在执行
网友评论