GCD基础

一 GCD 与NSOperation 

GCD -- (iOS4.0)多线程解决方案

    将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)

    拿到dispatch_get_main_queue,线程之间的通信

    NSOperation -- (iOS2.0)  (后经苹果改造)

    将操作添加到队列里

    [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行

    NSOperation可以设置最大并发数(用GCD处理,比较麻烦)

    可以暂停可以继续,也就是挂起操作

    取消所有的任务

    设置依赖关系

二 什么是GCD

  GCD本身是苹果公司为多核的并发运算提出的解决办法,GCD工作时会自动利用更多的处理器核心,以充分利用更强大的机器.它是基于C语言的

  如果使用GCD,完全由系统管理线程,我不需要手动编写线程代码,只需定义想要执行的任务,然后将其添加到适当的调度队列.GCD会负责创建线程,调度你的任务,系统直接提供线程管理

三创建

(1)//串行队列:一个一个执行

//同步操作:不开启新的线程

//执行结果:不开启新的线程,一个一个顺序执行

{

  //label:队列名

    //attr:队列属性(串行,并发)

    //DISPATCH_QUEUE_SERIAL 串行

    //DISPATCH_QUEUE_CONCURRENT 并发

    //#define DISPATCH_QUEUE_SERIAL NULL

       dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);

    NSLog(@"开始");

    //同步操作

    //操作任务:block

    dispatch_sync(queue, ^{

        //打印当前线程

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

    });

      NSLog(@"结束");

}

(2)//串行队列:一个一个执行

//异步操作:会开启新的线程

//执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

{

dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);

    NSLog(@"开始");

   for (NSInteger i = 0 ; i < 10; i ++ ) {

         //异步请求

        dispatch_async(queue, ^{

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

        });

    }

     NSLog(@"结束");

 }

(3)

//并发队列:多个线程同时执行

//异步操作:会开启新的线程

//执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

//开启并发队列 

{

dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

  NSLog(@"开始");

   for (NSInteger i = 0 ; i < 10; i ++ ) {

        //执行异步操作

        dispatch_async(queue, ^{

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

        });

    }

   NSLog(@"结束");}

(4)

//并发队列:多个线程同时执行

//同步操作:不会开启新的线程

//执行结果:不会开启新的线程,立即执行

dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

  NSLog(@"开始");

(5)

  // 主队列就是一种特殊的串行队列

    // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行

{

    dispatch_queue_t queue = dispatch_get_main_queue();

   NSLog(@"开始");

   for (NSInteger i = 0; i < 10; i ++) {

        //主队列执行异步操作,异步操作有一个等待的过程

        dispatch_async(queue, ^{

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

        });

    }

  for (NSInteger i = 0 ; i < 10; i ++ ) {

       dispatch_sync(queue, ^{

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

        });

    }

   NSLog(@"结束");

 }

(6)

 //在主队列里执行同步操作,产生死锁

    //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。

{ dispatch_queue_t queue = dispatch_get_main_queue();

   NSLog(@"1");

    dispatch_sync(queue, ^{

        NSLog(@"2");

    });

   NSLog(@"3");

 }

(7)

//全局队列

    //identifier  队列优先级

    //flags  苹果预留的参数(没有用)

    //DISPATCH_QUEUE_PRIORITY_DEFAULT  一般使用默认优先级

  //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

   //默认是并发队列,dispatch_get_global_queue用的多

   dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    for (NSInteger i = 0; i < 10; i++) {

       //并发加异步

        dispatch_async(queue, ^{

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

        });

   }

posted on 2016-03-15 22:26  杨春歌  阅读(230)  评论(0编辑  收藏  举报

导航