iOS多线程(3)GCD

1)GCD基本知识

01 两个核心概念-队列和任务
02 同步函数和异步函数

(2)GCD基本使用【重点】

01 异步函数+并发队列:开启多条线程,并发执行任务
02 异步函数+串行队列:开启一条线程,串行执行任务
03 同步函数+并发队列:不开线程,串行执行任务
04 同步函数+串行队列:不开线程,串行执行任务
05 异步函数+主队列:不开线程,在主线程中串行执行任务
06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)
07 注意同步函数和异步函数在执行顺序上面的差异

(3)GCD线程间通信

  //1.开子线程下载图片
    //创建全局队列(并发)
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //异步函数
    dispatch_async(queue, ^{

        //1.获取url地址
        NSURL *url = [NSURL URLWithString:@"http://www.huabian.com/uploadfile/2015/0914/20150914014032274.jpg"];

        //2.下载图片
        NSData *data = [NSData dataWithContentsOfURL:url];

        //3.把二进制数据转换成图片
        UIImage *image = [UIImage imageWithData:data];

        NSLog(@"----%@",[NSThread currentThread]);

        dispatch_sync(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
            NSLog(@"+++%@",[NSThread currentThread]);
        });
    });

(4)GCD其它常用函数


    01 栅栏函数(控制任务的执行顺序)
    dispatch_barrier_async(queue, ^{
        NSLog(@"--dispatch_barrier_async-");
    });

    02 延迟执行(延迟·控制在哪个线程执行)
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"---%@",[NSThread currentThread]);
    });

    03 一次性代码(注意不能放到懒加载)
    -(void)once
    {
        //整个程序运行过程中只会执行一次
        //onceToken用来记录该部分的代码是否被执行过
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSLog(@"-----");
        });
    }

    04 快速迭代(开多个线程并发完成迭代操作)
     /* 第一个参数:迭代的次数 第二个参数:在哪个队列中执行 第三个参数:block要执行的任务 */
       dispatch_apply(subpaths.count, queue, ^(size_t index) {
    });

    05 队列组(同栅栏函数)
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    //队列组中的任务执行完毕之后,执行该函数
    dispatch_group_notify(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);
    例:
    -(void)group
{
    //下载图片1

    //创建队列组
    dispatch_group_t group =  dispatch_group_create();

    //1.开子线程下载图片
    //创建队列(并发)
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_async(group, queue, ^{
        //1.获取url地址
        NSURL *url = [NSURL URLWithString:@"http://www.huabian.com/uploadfile/2015/0914/20150914014032274.jpg"];

        //2.下载图片
        NSData *data = [NSData dataWithContentsOfURL:url];

        //3.把二进制数据转换成图片
        self.image1 = [UIImage imageWithData:data];

        NSLog(@"1---%@",self.image1);
    });

    //下载图片2
    dispatch_group_async(group, queue, ^{
        //1.获取url地址
        NSURL *url = [NSURL URLWithString:@"http://img1.3lian.com/img2011/w12/1202/19/d/88.jpg"];

        //2.下载图片
        NSData *data = [NSData dataWithContentsOfURL:url];

        //3.把二进制数据转换成图片
        self.image2 = [UIImage imageWithData:data];
        NSLog(@"2---%@",self.image2);

    });

    //合成
    dispatch_group_notify(group, queue, ^{

        //开启图形上下文
        UIGraphicsBeginImageContext(CGSizeMake(200, 200));

        //画1
        [self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];

        //画2
        [self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];

        //根据图形上下文拿到图片
        UIImage *image =  UIGraphicsGetImageFromCurrentImageContext();

        //关闭上下文
        UIGraphicsEndImageContext();

        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
            NSLog(@"%@--刷新UI",[NSThread currentThread]);
        });
    });
}

你可能感兴趣的:(多线程,ios)