GCD完整版

来源:互联网 发布:淘宝怎样分期付款 编辑:程序博客网 时间:2024/06/10 04:11

GCD    全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”  纯C语言,提供了非常多强大的函数


GCD 有同步 异步 来执行串行队列 和 并发队列


同步:在当前线程中执行任务,不具备开启新线程的能力

异步:在新的线程中执行任务,具备开启新线程的能力

并发:多个任务并发(同时)执行

串行:一个任务执行完毕后,再执行下一个任务


串行队列

dispatch_queue_create 创建的队列. 这些队列是串行的。正因为如此,它们可以用来完成同步机制

调用函数dispatch_queue_create就行了。函数的第一个参数是一个标签,这纯是为了debug。 Apple建议我们使用倒置域名来命名队列,比如“com.dreamingwish.subsystem.task”。这些名字会在崩溃日志中被显示出 来,也可以被调试器调用,这在调试中会很有用。第二个参数目前还不支持,传入NULL就行了。


//创建一个串行队列 队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行

//先进先出


    //创建一个同步线程队列

    dispatch_queue_t serial =dispatch_queue_create("队列1",DISPATCH_QUEUE_SERIAL);//DISPATCH_QUEUE_SERIAL同步队列

    //通过异步执行这个线程队列

    

    //block里面执行的内容(方法)放到serial里面

    dispatch_async(serial, ^{

        //执行操作

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

            NSLog(@"线程1");

        }

    });

    dispatch_async(serial, ^{

        NSLog(@"线程2");

    });

    

    




//创建一个并发执行队列,block被分发到多个线程去执行 

//创建并发线程队列

    dispatch_queue_t concurrent =dispatch_queue_create("并发1",DISPATCH_QUEUE_CONCURRENT);

    

    //异步执行这个并发线程队列

    dispatch_async(concurrent, ^{

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

            NSLog(@"线程3");

        }

    });

    dispatch_async(concurrent, ^{

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

            NSLog(@"线程4");

        }

    });



使用主队列(跟主线程相关联的队列)

dispatch_queue_t queue = dispatch_get_main_queue();




并发队列


GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建

使用dispatch_get_global_queue函数获得全局的并发队列


    dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);

  

   第一个参数为优先级,第二个参数写0即可 日后使用的

   

  

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        //方法

    });

    

    

   全局队列优先级

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)

#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台


同步函数不具备开启线程的能力,无论是什么队列都不会开启线程;异步函数具备开启线程的能力,开启几条线程由队列决定(串行队列只会开启一条新的线程,并发队列会开启多条线程)。

  

     

同步函数

(1)并发队列:不会开线程

(2)串行队列:不会开线程

异步函数

(1)并发队列:能开启N条线程

(2)串行队列:开启1条线程




0 0