建立线程方式-GCD

 

GCD

(1)GCD基本知识web

GCD:Grand central Dispatch  牛逼的中枢调度器
01 两个核心概念:队列和任务
  使用步骤:1.定制任务,2.将任务添加到队列中(遵循先进先出的原则) 02 同步函数和异步函数
  

(2)GCD基本使用并发

 01 异步函数+并发队列:开启多条线程,并发执行任务 app

02 异步函数+串行队列:开启一条线程,串行执行任务 异步

03 同步函数+并发队列:不开线程,串行执行任务 async

04 同步函数+串行队列:不开线程,串行执行任务 ide

05 异步函数+主队列:不开线程,在主线程中串行执行任务 函数

06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)url

主队列特色:若是发现主线程当前正在执行代码(任务),那么主队列将不会调度队列里的任务,直到主线程的任务执行完毕 spa

07 注意同步函数和异步函数在执行顺序上面的差别 线程

(3)GCD线程间通讯

//0.获取一个全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //1.先开启一个线程,把下载图片的操做放在子线程中处理
    dispatch_async(queue, ^{

       //2.下载图片
        NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];

        NSLog(@"下载操做所在的线程--%@",[NSThread currentThread]);

        //3.回到主线程刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
           self.imageView.image = image;
           //打印查看当前线程
            NSLog(@"刷新UI---%@",[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 快速迭代(开多个线程并发完成迭代操做)
       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);
相关文章
相关标签/搜索