GCD入门

作者: SmallWhiteMouse | 来源:发表于2018-05-04 17:52 被阅读20次

Grand Central Dispatch(GCD) 是 iOS 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统 。

1.队列加函数执行效果

_ 并发队列 手动创建的串行队列 主队列
同步函数
(sync)
1.不开辟新线程
2.串行执行任务
1.不开辟新线程
2.串行执行任务
1.不开辟新线程
2.串行执行任务
异步函数(async) 1.开辟新线程
2.并发执行任务
1.有开辟新线程
2.串行执行任务
1.不开辟新线程
2.串行执行任务

注意

  • 使用sync函数往当前串行队列中添加任务,会卡主当前串行队列.(我自己称之为循环等待)

2.助于GCD提升

  • 创建一个队列,队列的名称参考这种格式 "com.520it.queue" "download.image.queue"
  • 开不开线程由函数类型(同步 和异步)决定; 队列只决定你任务怎么去做。
  • 队列创建方式:各两种
//并发队列
1.//获取全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

2.//手动创建并发队列
dispatch_queue_t queue =  dispatch_queue_create("test.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
//串行队列
1.//获取主队列
dispatch_queue_t queue = dispatch_get_main_queue();


2.//手动创建并发队列
dispatch_queue_t queue =  dispatch_queue_create("test.serial.queue", DISPATCH_QUEUE_SERIAL);
  • 函数的功能
    async :可以在新的线程中执行任务,具备开启新线程的能力
    sync: 在当前线程做同步任务,不具备开启新线程的能力
  • 任务触发时机:
    sync 同步函数立即触发执行任务再向下执行
    async 异步函数是等当前任务做完再开始队列任务

3.好用的gcd函数列举

1).gcd执行任务函数:barrier栏杆
dispatch_barrier_async(dispatch_queue_t  queue, dispatch_block_t   block);
  • 在前面的执行任务结束后他才执行,而他后面的任务得等他结束以后才会执行
  • 实用场景举例:下载两张图片,等两张图片下载完成后再合成一张。就可以在合成之前加个栅栏。
2).延时执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
   //这个主队列 可以修改成其他队列。默认是在主线程执行   
});
3).一次性代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //在整个application运行过程中只执行一次(默认是线程安全的)
});
4).快速迭代
int  count = 10;
for (int i = 0; i < count; i++) {
    
}
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_apply(count, queue, ^(size_t index) {
    //执行count次代码,顺序不固定。如果队列是并发队列,可能创建多条线程执行,提升效率
});
5).组队列

示例:下载两张图片,等两张图片下载完成后再合成一张

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    _mArrImage = [NSMutableArray array];//保存下载好的图片

    //1.创建一个队列组
    dispatch_group_t  group = dispatch_group_create();
    dispatch_queue_t  queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加第一个任务:下载图片1
    dispatch_group_async(group, queue, ^{
        NSURL  *url = [NSURL URLWithString:@"https://img.haomeiwen.com/i6687791/5ad29d1a5c1c84db.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];
        UIImage  *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
        
        [self.mArrImage addObject:image];
    });
    
    
    //3.添加第二个任务:下载图片二
    dispatch_group_async(group, queue, ^{
        NSURL  *url = [NSURL URLWithString:@"https://img.haomeiwen.com/i6687791/2a51b4b27040ed41.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];
        UIImage  *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
        
        [self.mArrImage addObject:image];
    });
    
    //4.等待两张图片下载完成,将两张图片合成一张
    
    dispatch_group_notify(group, queue, ^{
        //开启新的图形上下文
        UIGraphicsBeginImageContext(CGSizeMake(300, 300));
        //绘制图片
        [_mArrImage[0] drawInRect:CGRectMake(0, 0, 300, 150)];
        [_mArrImage[1] drawInRect:CGRectMake(0, 150, 300, 150)];
        //取得图形上下文中的图片
        UIImage  *newImage = UIGraphicsGetImageFromCurrentImageContext();
        //结束上下文
        UIGraphicsEndImageContext();
        dispatch_async(dispatch_get_main_queue(), ^{
            //回到主线程显示图片
            [self.imageView setImage:newImage];
        });
        
    }); 
}

相关文章

  • GCD入门

    讲在前面 GCD、NSOperation、NSThread哪个你比较中意呢?我用的GCD很顺手啊,相信很多人也和我...

  • GCD入门

    Grand Central Dispatch(GCD) 是 iOS 开发的一个多核编程的较新的解决方法。它主要用于...

  • GCD 入门

    同步,异步:同步是指:当一个 block 被添加到 queue 时,会阻塞当前运行的线程,直到 block 中的内...

  • GCD入门(二)啦

    废话不多说,直接从GCD所提供的函数说起。 dispatch_once 相信大家对单例模式可谓是司空见惯了吧,常见...

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • GCD入门基础知识

    正式学习GCD之前,先要熟悉下列的术语: 串行与并发 1、任务串行执行就是每次只有一个任务被执行2、并发即在同一时...

  • 扩展GCD(求逆元,解同余方程等等)

    首先要知道gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(|a|,|b|)=gcd(b,a%b)...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • 浅析GCD

    GCD目录: 1. GCD简介 为什么要用GCD呢? GCD可用于多核的并行运算GCD会自动利用更多的CPU内核(...

网友评论

      本文标题:GCD入门

      本文链接:https://www.haomeiwen.com/subject/vrxjrftx.html