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);
}

打印结果


- (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);
}

打印结果:

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);
}

打印结果:

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);
}

打印结果:

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);

});

}

}

打印结果


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);

});

}

}

打印结果


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

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

  • 主队列,异步任务
    应用场景:
    回到主线程做事,一般是做和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.在开发中,主队列比较奇葩,主队列,就是苹果提供给我们,快速回到主线程的种实现机制.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容