博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程:GCD
阅读量:6291 次
发布时间:2019-06-22

本文共 2509 字,大约阅读时间需要 8 分钟。

队列


  • 串行队列
  1. 主队列:
dispatch_queue_t queue =dispatch_get_main_queue();复制代码

2.自定义的串行队列:DISPATCH_QUEUE_SERIAL

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_SERIAL);复制代码
  • 并行队列
  1. 全局并发队列:
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);复制代码

2.自定义并行队列:DISPATCH_QUEUE_CONCURRENT

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);复制代码

基本使用


1.创建队列。

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);复制代码

2.任务添加到队列,进行(同步或异步)执行。

dispatch_async(concurrentQueue, ^{    //任务}复制代码

GCD通信


dispatch_async(dispatch_get_global_queue(0,0), ^{//1.1确定url//1.2下载二进制数据到本地//1.3转换图片//更新UI//dispatch_async(dispatch_get_main_queue(), ^{});复制代码

异步处理任务,遇到UI更新操作是在主线程里完成。

一次性执行


static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        NSLog(@"任务执行了");    });复制代码
1.只在程序运行期间执行一次。2.block块内线程安全。3.原理:通过判断onceToken=0来决定是否执行。复制代码

主要用在单例。

延迟执行


  • performSlector
[self performSelector:@selector(run) withObject:nil afterDelay:2];复制代码
  • NSTimer
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(run) userInfo:nil repeats:NO];复制代码
  • GCD延迟执行:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        NSLog(@"任务执行了");    });复制代码
//第二个参数:改变线程。原理:先延迟时间,在把任务提交到队列执行。复制代码

控制线程个数


信号量机制

1.创建信号量

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);复制代码

2.降低信号量

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);复制代码

3.提升信号量

dispatch_semaphore_signal(semaphore)复制代码

信号量类似锁的机制:信号量就是个阀门,降低信号量(阀门变低),水可以通过。

信号量控制并发数。相较于operationQueue,GCD稍显麻烦。

dispatch_queue_t workConcurrentQueue = dispatch_queue_create("czw", DISPATCH_QUEUE_CONCURRENT);dispatch_queue_t serialQueue = dispatch_queue_create("c",DISPATCH_QUEUE_SERIAL);dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);for (NSInteger i = 0; i < 10; i++) {  dispatch_async(serialQueue, ^{      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);      dispatch_async(workConcurrentQueue, ^{          NSLog(@"thread:%@开始执行任务%d",[NSThread currentThread],(int)i);          sleep(1);          NSLog(@"thread:%@结束执行任务%d",[NSThread currentThread],(int)i);          dispatch_semaphore_signal(semaphore);});  });}复制代码

快速遍历


原理:开启多个线程,并发执行(放在并发队列才真正起作用。)

栅栏函数


dispatch_barrier_async:不能在全局并发队列使用

队列组


1.第一种方法。

dispatch_group_asyncdispatch_group_notify复制代码

2.第二种方法。

dispatch_group_enter()dispatch_group_leave()复制代码

转载地址:http://amkta.baihongyu.com/

你可能感兴趣的文章
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>