dispatch_suspend/dispatchp_resume

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执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容