如何取消GCD任务

1.dispatch_block_cancel

iOS8之后可以调用dispatch_block_cancel来取消(需要注意必须用dispatch_block_create创建dispatch_block_t,dispatch_block_cancel也只能取消尚未执行的任务,对正在执行的任务不起作用。)

- (void)gcdBlockCancel{
    dispatch_queue_t queue = dispatch_queue_create("com.gcdtest.www", DISPATCH_QUEUE_CONCURRENT);
    dispatch_block_t block1 = dispatch_block_create(0, ^{
        sleep(5);
        NSLog(@"block1 %@",[NSThread currentThread]);
    });
    dispatch_block_t block2 = dispatch_block_create(0, ^{
        NSLog(@"block2 %@",[NSThread currentThread]);
    });
    dispatch_block_t block3 = dispatch_block_create(0, ^{
        NSLog(@"block3 %@",[NSThread currentThread]);
    });
    dispatch_async(queue, block1);
    dispatch_async(queue, block2);
    dispatch_block_cancel(block3);
}

打印结果:

2018-03-0210:10:30.925com.hua[2796:284866] block2 {number =3, name = (null)}
2018-03-0210:10:30.930com.hua[2796:284889] block1 {number =4, name = (null)}

2.定义外部变量,用于标记block是否需要取消

该方法是模拟NSOperation,在执行block前先检查isCancelled = YES ?在block中及时的检测标记变量,当发现需要取消时,终止后续操作。

- (void)gcdCancel{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    __block BOOL isCancel = NO;
    dispatch_async(queue, ^{
        NSLog(@"任务001 %@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务002 %@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务003 %@",[NSThread currentThread]);
        isCancel = YES;
    });
    dispatch_async(queue, ^{
        // 模拟:线程等待3秒,确保任务003完成 isCancel=YESsleep(3);
        if(isCancel){
            NSLog(@"任务004已被取消 %@",[NSThread currentThread]);
        }else{
            NSLog(@"任务004 %@",[NSThread currentThread]);
        }
    });
}

打印结果:

2018-03-0210:15:20.825com.hua[3022:333990] 任务002 {number =4, name = (null)}
2018-03-0210:10:20.826com.hua[3022:333989] 任务001 {number =3, name = (null)}
2018-03-0210:10:20.827com.hua[3022:333992] 任务003 {number =5, name = (null)}
2018-03-0210:10:20.828com.hua[3022:334006] 任务004已被取消 {number =6, name = (null)}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自:教你如何取消GCD任务 GCD 是一种非常方便的使用多线程的方式。通过使用 GCD,我们可以在确保尽量简单...
    路漫漫其修远兮Wzt阅读 3,008评论 0 1
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖风阅读 7,568评论 0 0
  • 一、多线程简介: 所谓多线程是指一个 进程 -- process(可以理解为系统中正在运行的一个应用程序)中可以开...
    寻形觅影阅读 4,814评论 0 6
  • 一、基本介绍 Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方...
    wuyukobe阅读 3,153评论 0 1
  • 我和小表(段佳南)从出世开始,便彼此相伴,一起玩耍、上学。由于比我早来这个世界6个多月,年龄上他比我年长半岁,所以...
    小幸甫阅读 2,394评论 0 1

友情链接更多精彩内容