GCD入门

2018-05-04  本文已影响20人  SmallWhiteMouse

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

1.队列加函数执行效果

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

注意

2.助于GCD提升

//并发队列
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);

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];
        });
        
    }); 
}
上一篇 下一篇

猜你喜欢

热点阅读