GCD的一些方法使用


1.dispatch_barrier_async
2.dispatch_apply
3.dispatch_group_t
4.dispatch_semaphore_t


dispatch_barrier_async
dispatch_barrier_async 或者 dispatch_barrier_sync 要添加在自定义的queue中,他会等待这个queue队列中先于他之前的任务执行完成之后再执行。
阻塞他之后的闭包任务。


//并发的
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.kkkk", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
//        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列任务kkkk——————1");
        
        NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
        NSData * data = [[NSData alloc]initWithContentsOfURL:url];
        UIImage *image = [[UIImage alloc]initWithData:data];
        if (data != nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                
                NSLog(@"队列任务kkkk——————111");
                
            });
        }
    });
    
    dispatch_async(queue, ^{
        NSLog(@"队列任务kkkk——————2");
    });
    
    dispatch_barrier_async(queue, ^{
        
        NSLog(@"队列任务kkkk------阻塞的队列 barrier 要等其他队列执行完成之后 才能执行吗 ,也必须加载在自己定义的队列中");
        
        [NSThread sleepForTimeInterval:1];
        
    });
    
    
    
    
    dispatch_async(queue, ^{
        
        NSLog(@"队列任务kkkk——————3 会等待barrier执行完成之后再执行");
        [NSThread sleepForTimeInterval:1];
    });
    
    
    
    dispatch_barrier_async(queue, ^{
        
        NSLog(@"队列任务kkkk------测试多个");
        
        [NSThread sleepForTimeInterval:1];
        
    });
    
    
    dispatch_async(queue, ^{
        
        NSLog(@"队列任务kkkk——————4 会等待barrier执行完成之后再执行");
    });
    
    NSLog(@"=========================_+++========++++++");
    

输出

BangBangXing[4466:70300] +++++++++++++++++++++++===================
2017-03-08 10:53:31.305 BangBangXing[4466:70300] =========================_+++========++++++
2017-03-08 10:53:31.305 BangBangXing[4466:70370] 队列任务kkkk——————1
2017-03-08 10:53:31.305 BangBangXing[4466:70499] 队列任务kkkk——————2
2017-03-08 10:53:32.363 BangBangXing[4466:70370] 队列任务kkkk------阻塞的队列 barrier 要等其他队列执行完成之后 才能执行吗 ,也必须加载在自己定义的队列中
2017-03-08 10:53:32.363 BangBangXing[4466:70300] 队列任务kkkk——————111
2017-03-08 10:53:33.428 BangBangXing[4466:70370] 队列任务kkkk——————3 会等待barrier执行完成之后再执行
2017-03-08 10:53:34.493 BangBangXing[4466:70370] 队列任务kkkk------测试多个
2017-03-08 10:53:35.568 BangBangXing[4466:70370] 队列任务kkkk——————4 会等待barrier执行完成之后再执行

dispatch_apply往队列queue中重复添加任务,会阻塞后面的线程,等待他里面添加的任务执行成功之后再往下继续执行。

NSLog(@"============== begin ==============");
    
    //并发的
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.kkkk", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:2];
        NSLog(@"队列任务kkkk——————1");
    });
    
    //重复执行 将闭包里面的任务添加到queue中 添加5个
    dispatch_apply(5, queue, ^(size_t i) {
        
        [NSThread sleepForTimeInterval:1];
        
        NSLog(@"队列任务apply添加的kkkk——————%zu",i);
        
    });
    
    dispatch_async(queue, ^{
        
        [NSThread sleepForTimeInterval:2];
        NSLog(@"队列任务kkkk——————2");
    });
    
    
    dispatch_async(queue, ^{
    
        NSLog(@"队列任务kkkk——————3");
    });
    
    NSLog(@"============== end ==============");
    

打印

2017-03-08 11:15:41.799 BangBangXing[5609:83837] ============== begin ==============
2017-03-08 11:15:42.801 BangBangXing[5609:83947] 队列任务apply添加的kkkk——————2
2017-03-08 11:15:42.801 BangBangXing[5609:84041] 队列任务apply添加的kkkk——————1
2017-03-08 11:15:42.801 BangBangXing[5609:83837] 队列任务apply添加的kkkk——————0
2017-03-08 11:15:42.801 BangBangXing[5609:83940] 队列任务apply添加的kkkk——————3
2017-03-08 11:15:43.870 BangBangXing[5609:84018] 队列任务kkkk——————1
2017-03-08 11:15:43.870 BangBangXing[5609:83947] 队列任务apply添加的kkkk——————4
2017-03-08 11:15:43.871 BangBangXing[5609:83837] ============== end ==============
2017-03-08 11:15:43.871 BangBangXing[5609:84018] 队列任务kkkk——————3
2017-03-08 11:15:45.926 BangBangXing[5609:83947] 队列任务kkkk——————2

dispatch_group_t用来监视多个异步任务执行情况,一种是利用dispatch_wait来阻塞当前的进程,等待执行完成或者超时之后继续下一步执行。一种是利用dispatch_group_notify来监听所有任务执行完成之后的回调,不会阻塞,或者和enter和leave配合。

  • dispatch_group_wait
NSLog(@"============== begin ==============");
    
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.group", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务1");
    });
    
    dispatch_group_async(group, queue, ^{
        
        [NSThread sleepForTimeInterval:5];
        NSLog(@"执行任务2");
    });
    
    dispatch_group_async(group, queue, ^{
        
        [NSThread sleepForTimeInterval:5];
        NSLog(@"执行任务3");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务4");
    });
    
    //设置超时时间
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    
    NSLog(@"============== end ==============");
    

打印

2017-03-08 11:36:57.511 BangBangXing[6987:96675] ============== begin ==============
2017-03-08 11:36:57.512 BangBangXing[6987:96761] 执行任务1
2017-03-08 11:36:57.512 BangBangXing[6987:96839] 执行任务4
2017-03-08 11:37:02.583 BangBangXing[6987:96767] 执行任务3
2017-03-08 11:37:02.583 BangBangXing[6987:96768] 执行任务2
2017-03-08 11:37:02.584 BangBangXing[6987:96675] ============== end ==============
  • dispatch_group_notify
NSLog(@"============== begin ==============");
    
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.group", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务1");
    });
    
    dispatch_group_async(group, queue, ^{
        
        [NSThread sleepForTimeInterval:5];
        NSLog(@"执行任务2");
    });
    
    dispatch_group_async(group, queue, ^{
        
        [NSThread sleepForTimeInterval:5];
        NSLog(@"执行任务3");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务4");
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"所有任务执行完成");
    });
    
    
    NSLog(@"============== end ==============");

打印

2017-03-08 11:48:24.310 BangBangXing[7362:101941] ============== begin ==============
2017-03-08 11:48:24.312 BangBangXing[7362:101941] ============== end ==============
2017-03-08 11:48:24.312 BangBangXing[7362:102007] 执行任务1
2017-03-08 11:48:24.312 BangBangXing[7362:102000] 执行任务4
2017-03-08 11:48:29.359 BangBangXing[7362:102095] 执行任务2
2017-03-08 11:48:29.359 BangBangXing[7362:102009] 执行任务3
2017-03-08 11:48:29.359 BangBangXing[7362:102009] 所有任务执行完成
  • dispatch_group_enter 和 dispatch_group_leave

enter和leave是成对出现的,开始一个任务之前要先enter 任务完成之后再leave,他们相当于一个dispatch_group_async执行

NSLog(@"============== begin ==============");
    
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.group", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_enter(group);
    [YHHttps httpsGetWithURL:@"http://www.weather.com.cn/data/sk/101010100.html" andParameterDic:nil andResponseBlock:^(RequestResultObj *resultObj) {
        
        NSLog(@"请求任务1完成");
        dispatch_group_leave(group);
    }];
    
    dispatch_group_enter(group);
    [YHHttps httpsGetWithURL:@"http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600" andParameterDic:nil andResponseBlock:^(RequestResultObj *resultObj) {
        
        NSLog(@"请求任务2完成");
        dispatch_group_leave(group);
    }];
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"所有任务执行完成");
    });
    
    
    NSLog(@"============== end ==============");

输出

2017-03-08 12:45:56.875 BangBangXing[7999:120101] ============== begin ==============
2017-03-08 12:45:56.882 BangBangXing[7999:120101] ============== end ==============
2017-03-08 12:45:57.080 BangBangXing[7999:120101] 请求任务2完成
2017-03-08 12:45:57.082 BangBangXing[7999:120101] 请求任务1完成
2017-03-08 12:45:57.082 BangBangXing[7999:120338] 所有任务执行完成

dispatch_semaphore_t信号量。
singal 信号量+1,释放资源了+1
wait 信号量-1,要占用资源了-1
信号量总数大于等于0的时候程序继续执行,
信号量总数小于0的时候阻塞等待

NSLog(@"============== begin ==============");
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    dispatch_queue_t queue = dispatch_queue_create("com.lanhai.semaphore", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"semaphore + 1");
        
        dispatch_semaphore_signal(semaphore);
        
    });
    
    NSLog(@"semaphore - 1");
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    NSLog(@"============== end ==============");

输出

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

推荐阅读更多精彩内容

  • GCD (Grand Central Dispatch) :iOS4 开始引入,使用更加方便,程序员只需要将任务添...
    池鹏程阅读 1,323评论 0 2
  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 752评论 0 1
  • Managing Units of Work(管理工作单位) 调度块允许您直接配置队列中各个工作单元的属性。它们还...
    edison0428阅读 7,935评论 0 1
  • 一. 重点: 1.dispatch_queue_create(生成Dispatch Queue) 2.Main D...
    BestJoker阅读 1,574评论 2 2
  • 多年以前,今天是我的节日。 多年以后,今天也是我的节日。 纵然是大叔,也是一个有童心的大叔。 依稀记得小学时第一次...
    子夜月寒阅读 440评论 0 0