GCD 是一种非常方便的使用多线程的方式。通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程。在 “复杂必死” 的多线程编程中,保持简单就是避免错误的金科玉律。然而,GCD不像NSOperation那样可以调用 -(void)cancel 取消一个操作的执行(注意这里的取消只是针对未执行的任务设置finished = YES,如果这个操作已经在执行了,那么我们只能等其操作完成。当我们调用cancel方法的时候,他只是将isCancelled设置为YES)。那我们想取消GCD任务怎么办?难道真的束手无策了吗?

NO,怎么可能这么容易就放弃!下面我将为大家介绍如何实现取消GCD任务。

第一种:dispatch_block_cancel

iOS8之后可以调用dispatch_block_cancel来取消(需要注意必须用dispatch_block_create创建dispatch_block_t

代码示例:

- (void)gcdBlockCancel{

    dispatch_queue_t queue = dispatch_queue_create("com.gcdtest.www", DISPATCH_QUEUE_CONCURRENT);

    dispatch_block_t block1 = dispatch_block_create(, ^{
sleep();
NSLog(@"block1 %@",[NSThread currentThread]);
}); dispatch_block_t block2 = dispatch_block_create(, ^{
NSLog(@"block2 %@",[NSThread currentThread]);
}); dispatch_block_t block3 = dispatch_block_create(, ^{
NSLog(@"block3 %@",[NSThread currentThread]);
}); dispatch_async(queue, block1);
dispatch_async(queue, block2);
dispatch_block_cancel(block3);
}

打印结果:

-- ::39.935 beck.wang[:] block2 <NSThread: 0x6180000758c0>{number = , name = (null)}
-- ::44.940 beck.wang[:] block1 <NSThread: 0x618000074f80>{number = , name = (null)}

同样的,dispatch_block_cancel也只能取消尚未执行的任务,对正在执行的任务不起作用。

  第二种:定义外部变量,用于标记block是否需要取消

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

- (void)gcdCancel{

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

    __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=YES
sleep();
if(isCancel){
NSLog(@"任务004已被取消 %@",[NSThread currentThread]);
}else{
NSLog(@"任务004 %@",[NSThread currentThread]);
}
});
}

打印结果:

-- ::54.017 beck.wang[:] 任务002 <NSThread: 0x60800007f740>{number = , name = (null)}
-- ::54.017 beck.wang[:] 任务001 <NSThread: 0x600000261d80>{number = , name = (null)}
-- ::54.017 beck.wang[:] 任务003 <NSThread: 0x618000261800>{number = , name = (null)}
-- ::02.266 beck.wang[:] 任务004已被取消 <NSThread: 0x608000267100>{number = , name = (null)}

教你如何取消GCD任务的更多相关文章

  1. iOS 多线程开发之OperationQueue(二)NSOperation VS GCD

    原创Blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  2. Swift之GCD 使用指南2

    Grand Central Dispatch大中枢派发:joy: 或俗称 GCD 是一件极其强大的武器.它为你提供了很多底层工具(比如队列和信号量),你可以组合这些工具来实现自己想要的多线程效果.不幸 ...

  3. Eclipse取消汉化以及设置语言的方法

    Eclipse取消汉化以及设置语言的方法 转 https://jingyan.baidu.com/article/11c17a2c2c1939f446e39d13.html Eclipse下载以后都是 ...

  4. ubuntu18.04下取消中键复制粘贴功能

    Q: armlinux开发,主机采用ubuntu18.04操作系统,使用过程中关于鼠标中键有如下操作现象, 操作: 1.选中文本, 2.将鼠标光标定位到要插入的位置 3.按下鼠标中键 现象:将自动复制 ...

  5. dispatch_group_async 使用详解

    dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作.这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了.下面是一段例子 ...

  6. ThinkPad E431按F1后直接进入系统无法进入BIOS

    联想的ThinkPad系列笔记本一般是按F1进如BIOS的,但是由于现在联想的笔记本多数都是预装Win 8或者更高版本的系统,所以有时候就没办法直接按F1进去BIOS.其原因是因为Win 8或者更高版 ...

  7. iOS线程浅析

    一.线程概述 1. iOS里面的线程按种类可分为同步线程和异步线程.同步线程指调用同步线程的地方必须等到同步线程运行完成才干够继续向下运行.而调用异步线程的地方则在运行完调用异步线程的语句后就能够继续 ...

  8. LOJ 6229 LCM / GCD (杜教筛+Moebius)

    链接: https://loj.ac/problem/6229 题意: \[F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{ ...

  9. LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)

    做题重心转移到 LOJ 了. 至于为什么,如果你知道“……”的密码,就去看吧. LOJ 上用户自创题大多数都不可做,今天看到个可做题(而且还是个水题),就来做了一发. 明显枚举立方根.(以下令 $m= ...

随机推荐

  1. javaWeb学习总结(11)- 监听器(Listener)学习(2)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  2. 建造者模式—设计角度重温DNF中的角色

    应用场景 假设现在我们要设计DNF中的人物角色(鬼剑士.神枪手.魔法师.圣骑士.格斗家).然而,利用面对对象的思想,必须先从实体入手,每一个角色都包含各种装备.武器.配饰,这些就当做要建造的零件,然后 ...

  3. php+mysql 除了设置主键防止表单提交内容重复外的另一种方法

    感觉好久没有更新博客了,一直在做网站及后台,也没有遇到让我觉得可以整理的内容,之前做的一个系统,已经完成了,后来客户又要求加一个功能,大概就是表单提交的时候,约束有一项不能和以前的内容重复,如图 比如 ...

  4. 用JQuery写的滚动条,可以改变样式哦!

    很早之前在做项目的时候要用到自定义的滚动条,可是现在的CSS2只能改改颜色什么的,对于改变形状或者更高级的用法根本不可能实现,没办法只能自己写一个了.(好像CSS3可以该形状,不过没研究过有兴趣的童鞋 ...

  5. Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)

    例子: 定义泛型Store package javabased; public interface Store<T> { } 两个实现类StringStore,IntegerStore p ...

  6. debian将默认中文改成英文

    $ sudo export LANG=en_US.UTF-8 $ sudo dpkg-reconfigure locales

  7. 快速上手 Kotlin 的 11 招

    本文转载自 Kotlin 公众号(KotlinX) 作者:bennyhuo 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...

  8. Markdown软件推荐--Typora

    非常适合记录笔记. ▌ 所见即所得+所写即所得 Ctrl+/快捷键,转换成纯代码界面. ▌ CSS自设置样式 1.Theme下自带样式系列 2.File- Preference中选择Open Them ...

  9. easyUI的简单了解

    首先简单的介绍一下jQuery EasyUI,它是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写 ...

  10. js实现点击copy,可兼容

    在实现功能时写的一个小demo,可以实现点击复制内容(任何你需要copy的文字内容data). 经测试,可兼容 chrome, edge, firefox, ie, opera, safari,至于版 ...