GCD中dispatch_suspend/dispatch_resume使用方法

在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] 队列挂起时未执行,需恢复队列后在执行

你可能感兴趣的:(GCD中dispatch_suspend/dispatch_resume使用方法)