美文网首页OC-开发案例收集
GCD中dispatch_suspend/dispatch_re

GCD中dispatch_suspend/dispatch_re

作者: 山水域 | 来源:发表于2017-05-04 16:28 被阅读1961次

    在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_re

        本文链接:https://www.haomeiwen.com/subject/dhzrtxtx.html