iOS GCD四大队列

iOS GCD四大队列

GCD的队列

  • 串行队列:加入到里面的任务是一个一个有顺序的调度的。
    • 串行队列,同步任务
      特点:有顺序的执行,并且不会开辟新线程,就在当前线程执行
      应用场景:FMDB,它为什么要设计成串行队列,同步任务,为了保证数据的安全

    • 串行队列,异步任务
      特点:有顺序的执行,并且在开辟的新的线程中执行,并且只开一条线程!!!
      应用场景:耗时操作,并且有严格先后顺序
      去付费网站上,下载片

          登录--->付费--->下载
      
- (void)serialSync{
    //1.任务
    void  (^task1)  () = ^(){
        NSLog(@"task1---%@",[NSThread currentThread]);
    };
    
    void (^task2)() = ^() {
        NSLog(@"task2---%@",[NSThread currentThread]);
    };
    
    void (^task3)() = ^() {
        NSLog(@"task3---%@",[NSThread currentThread]);
    };
    
    //2.队列
    /**
        参数1:队列的名称,方便调试,一般是公司域名倒写
        www.fichfit.cn
        cn.fichfit
        参数2:队列的类型,如果创建是串行队列,还可以写NULL
     */
    dispatch_queue_t serailQueue = dispatch_queue_create("cn.itcast.serialA", DISPATCH_QUEUE_SERIAL);
    
    
    //3.将任务加入到队列中,同步的执行
    dispatch_sync(serailQueue, task1);
    dispatch_sync(serailQueue, task2);
    dispatch_sync(serailQueue, task3);
}

打印结果

 

700

- (void)serialAsync{
    //1.任务
    void  (^task1)  () = ^(){
        NSLog(@"task1---%@",[NSThread currentThread]);
    };
    
    void (^task2)() = ^() {
        NSLog(@"task2---%@",[NSThread currentThread]);
    };
    
    void (^task3)() = ^() {
        NSLog(@"task3---%@",[NSThread currentThread]);
    };
    
    //2.队列
    /**
     参数1:队列的名称,方便调试,一般是公司域名倒写
     

     参数2:队列的类型,如果创建是串行队列,还可以写NULL
     */
    dispatch_queue_t serailQueue = dispatch_queue_create("cn.itcast.serialA", DISPATCH_QUEUE_SERIAL);
    
    
    //3.将任务加入到队列中,异步的执行
    dispatch_async(serailQueue, task1);
    dispatch_async(serailQueue, task2);
    dispatch_async(serailQueue, task3);
}

打印结果:

700

Snip20170411_2.png

  • 并发队列:
    特点:
    任务可以同时执行,这样可以提高程序的运行效率.

    • 并发队列,同步任务
      特点:没有开辟新线程,同时是按照顺序
      应用场景:开发中几乎不用

    • 并发队列,异步任务
      特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能 没有顺序.
      应用场景:
      比如下载多部片

- (void)concurrentSync{
    //1.任务
    void(^task1)() = ^() {
        NSLog(@"task1---%@",[NSThread currentThread]);
    };
    
    void(^task2)() = ^() {
        NSLog(@"task2---%@",[NSThread currentThread]);
    };
    
    void(^task3)() = ^() {
        NSLog(@"task3---%@",[NSThread currentThread]);
    };
    
    //2.队列,并发队列,必须自己写,不能写NULL
    dispatch_queue_t concurrentQueue =  dispatch_queue_create("cn.fichfit.concurrentQueueA", DISPATCH_QUEUE_CONCURRENT);
    
    //3.要把任务和队列绑定起来,同步的去执行
    dispatch_sync(concurrentQueue, task1);
    dispatch_sync(concurrentQueue, task2);
    dispatch_sync(concurrentQueue, task3);
}

打印结果:

700

Snip20170411_3.png

- (void)concurrentAsync{
    //1.任务
    void(^task1)() = ^() {
        NSLog(@"task1---%@",[NSThread currentThread]);
    };
    
    void(^task2)() = ^() {
        NSLog(@"task2---%@",[NSThread currentThread]);
    };
    
    void(^task3)() = ^() {
        NSLog(@"task3---%@",[NSThread currentThread]);
    };
    
    //2.队列,并发队列,必须自己写,不能写NULL
    dispatch_queue_t concurrentQueue =  dispatch_queue_create("cn.fichfit.concurrentQueueA", DISPATCH_QUEUE_CONCURRENT);
    
    //3.要把任务和队列绑定起来,异步的去执行
    dispatch_async(concurrentQueue, task1);
    dispatch_async(concurrentQueue, task2);
    dispatch_async(concurrentQueue, task3);
}

打印结果:

700

Snip20170411_4.png

  • 全局队列:
    和并发队列,执行效果一样,只是说,并发队列,需要我们程序员,自己创建
    而全局队列,是由于系统提供

      特点:
          任务可以同时执行,这样可以提高程序的运行效率.
    
  • 全局队列,同步任务
    特点:没有开辟新线程,同时是按照顺序
    应用场景:开发中几乎不用

  • 全局队列,异步任务
    特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能 没有顺序.
    应用场景:
    比如下载多部片

- (void)gcdDemo3

{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//全局队列+同步任务

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

//同步任务

dispatch_sync(queue, ^{

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

});

}

}

打印结果

 

677

Snip20170411_5.png

- (void)gcdDemo3

{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//全局队列+异步任务

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

dispatch_async(queue, ^{

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

});

}

}

打印结果

 

675

  • 主队列(奇葩):
    特点:
    它永远在主线程工作,这个是苹果给开发人员,提供,回到主线程做事的一种机制

  • 主队列,同步任务
    特点:主队列,只有在主线程空闲的时候,才能调度里面的任务
    造成死锁

  • 主队列,异步任务
    应用场景:
    回到主线程做事,一般是做和UI相关的工作.


- (void)mainSync{
    NSLog(@"%s",__func__);
    
    //1.任务
    void(^task1)() = ^() {
        NSLog(@"%@----task1",[NSThread currentThread]);
    };
    
    void(^task2)() = ^() {
        NSLog(@"%@----task2",[NSThread currentThread]);
    };
    
    void(^task3)() = ^() {
        NSLog(@"%@----task3",[NSThread currentThread]);
    };
    
    //2.队列,获取系统提供的主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    //3.将任务添加到队列,将这二者绑定,同步的执行
    dispatch_sync(mainQueue, task1);
    dispatch_sync(mainQueue, task2);
    dispatch_sync(mainQueue, task3);
    
}

- (void)mainAsync{
    NSLog(@"mainAsync %s",__func__);
    
    //1.任务
    void(^task1)() = ^() {
        NSLog(@"%@----task1",[NSThread currentThread]);
    };
    
    void(^task2)() = ^() {
        NSLog(@"%@----task2",[NSThread currentThread]);
    };
    
    void(^task3)() = ^() {
        NSLog(@"%@----task3",[NSThread currentThread]);
    };
    
    //2.队列,获取系统提供的主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    //3.将任务添加到队列,将这二者绑定,异步的执行
    dispatch_async(mainQueue, task1);
    dispatch_async(mainQueue, task2);
    dispatch_async(mainQueue, task3);

}

<h2>总结:任务的优先级比队列优先级高,所以我们在队列和任务的各种组合的时候,首先要看我们的任务.</h2>

  • 1.开不开线程,由任务决定
    • 异步才有开辟线程的能力,同步没有开辟线程的能力
    • 异步是在其它线程上执行,同步,在当前线程上执行.
  • 2.在开发中,主队列比较奇葩,主队列,就是苹果提供给我们,快速回到主线程的种实现机制.

转载于:https://my.oschina.net/fadoudou/blog/1798530

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值