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

你可能感兴趣的:(dispatch_suspend/dispatchp_resume)