iOS-GCD多线程编程4

                     iOS-GCD多线程编程详解4


今天主要讨论的是dispatch_group_t及其它的使用。


一.dispatch_qroup_t

dispatch_group_t就是提交的任务的一个集合,异步调用的block集合。

创建dispatch_qroup_t group = dispatch_group_create();这样就创建了一个组。

怎么向group中添加block任务了。

 dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block3");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block4");
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"block5");
    });


运行结果:

1:

2015-01-09 23:17:52.833 GCDTest[699:32388] block2

2015-01-09 23:17:52.834 GCDTest[699:32411] block5

2015-01-09 23:17:52.833 GCDTest[699:32389] block3

2015-01-09 23:17:52.833 GCDTest[699:32387] block1

2015-01-09 23:17:52.833 GCDTest[699:32410] block4

2:

2015-01-09 23:19:26.610 GCDTest[706:33157] block1

2015-01-09 23:19:26.610 GCDTest[706:33155] block2

2015-01-09 23:19:26.610 GCDTest[706:33156] block3

2015-01-09 23:19:26.610 GCDTest[706:33158] block4

2015-01-09 23:19:26.610 GCDTest[706:33161] block5

3:

2015-01-09 23:19:53.354 GCDTest[711:33486] block1

2015-01-09 23:19:53.355 GCDTest[711:33492] block5

2015-01-09 23:19:53.354 GCDTest[711:33487] block2

2015-01-09 23:19:53.354 GCDTest[711:33489] block3

2015-01-09 23:19:53.354 GCDTest[711:33488] block4

加入到group中的任务是异步并发执行。队列为dispatch_get_global_queue(0, 0)。


把group放到主队列中会怎样了:

dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block3");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block4");
    });
    
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        NSLog(@"block5");
    });
运行结果:一直不变

2015-01-09 23:21:55.289 GCDTest[735:34297] block1

2015-01-09 23:21:55.291 GCDTest[735:34297] block2

2015-01-09 23:21:55.291 GCDTest[735:34297] block3

2015-01-09 23:21:55.291 GCDTest[735:34297] block4

2015-01-09 23:21:55.291 GCDTest[735:34297] block5

顺序异步执行。


通过加入到不同队列可以看出group就是逻辑上把block任务分组而已。它的执行顺序还是与它被加入到什么队列中有关。


二.dispatch_group_enter与dispatch_group_leave的使用

这两个函数总是成对出现的,有进入就有出,如果你要添加很多个block,你是手动一个一个的去调用dispatch_group_async还是通过一个循环加入,这两个函数就是提供这样的功能。


dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            
            NSLog(@"group 1 --block --%d",i);
            dispatch_group_leave(group);
    
        });
        
    }

运行结果:

2015-01-09 23:42:11.962 GCDTest[1011:42026] group 1 --block --1

2015-01-09 23:42:11.962 GCDTest[1011:42030] group 1 --block --3

2015-01-09 23:42:11.962 GCDTest[1011:42025] group 1 --block --2

2015-01-09 23:42:11.962 GCDTest[1011:42027] group 1 --block --0

2015-01-09 23:42:11.962 GCDTest[1011:42031] group 1 --block --4

运行效果也是异步并发执行的。


dispatch_group_t与dispatch_barrier_async的联合使用:

 dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            
            NSLog(@"group 1 --block --%d",i);
            dispatch_group_leave(group);
    
        });
        
    }
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"barrier block");
    });
    
    dispatch_group_t group2 = dispatch_group_create();
    
    for (int i=0; i<5; i++) {
        dispatch_group_enter(group2);
        dispatch_async(queue, ^{
            
            NSLog(@"group 2 --block --%d",i);
            dispatch_group_leave(group2);
            
        });
        
    }

运行效果:

1:

2015-01-09 23:44:01.434 GCDTest[1029:42724] group 1 --block --2

2015-01-09 23:44:01.434 GCDTest[1029:42723] group 1 --block --1

2015-01-09 23:44:01.434 GCDTest[1029:42722] group 1 --block --0

2015-01-09 23:44:01.435 GCDTest[1029:42729] group 1 --block --3

2015-01-09 23:44:01.435 GCDTest[1029:42730] group 1 --block --4

2015-01-09 23:44:01.435 GCDTest[1029:42730] barrier block

2015-01-09 23:44:01.436 GCDTest[1029:42730] group 2 --block --0

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --2

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --3

2015-01-09 23:44:01.436 GCDTest[1029:42729] group 2 --block --4

2015-01-09 23:44:01.436 GCDTest[1029:42730] group 2 --block --1

2.

2015-01-09 23:46:23.936 GCDTest[1040:43990] group 1 --block --0

2015-01-09 23:46:23.936 GCDTest[1040:43993] group 1 --block --1

2015-01-09 23:46:23.936 GCDTest[1040:43992] group 1 --block --2

2015-01-09 23:46:23.936 GCDTest[1040:43991] group 1 --block --3

2015-01-09 23:46:23.937 GCDTest[1040:43997] group 1 --block --4

2015-01-09 23:46:23.939 GCDTest[1040:43997] barrier block

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --0

2015-01-09 23:46:23.939 GCDTest[1040:43991] group 2 --block --1

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --2

2015-01-09 23:46:23.939 GCDTest[1040:43991] group 2 --block --3

2015-01-09 23:46:23.939 GCDTest[1040:43997] group 2 --block --4

3:

2015-01-09 23:46:51.977 GCDTest[1059:44419] group 1 --block --3

2015-01-09 23:46:51.976 GCDTest[1059:44420] group 1 --block --0

2015-01-09 23:46:51.977 GCDTest[1059:44426] group 1 --block --4

2015-01-09 23:46:51.977 GCDTest[1059:44421] group 1 --block --2

2015-01-09 23:46:51.976 GCDTest[1059:44418] group 1 --block --1

2015-01-09 23:46:51.978 GCDTest[1059:44418] barrier block

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --1

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --2

2015-01-09 23:46:51.978 GCDTest[1059:44418] group 2 --block --0

2015-01-09 23:46:51.978 GCDTest[1059:44421] group 2 --block --3

2015-01-09 23:46:51.979 GCDTest[1059:44418] group 2 --block --4

从运行结果来看,dispatch_barrier_async对group也是起到作用的,从而可以建立group之间的执行先后及其依赖关系。


dispatch_group_notify的使用

dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block1");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block2");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"block3");
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"我是所有block运行完之后才运行的");
    });

运行结果:

1:

2015-01-10 00:03:09.250 GCDTest[1285:51528] block3

2015-01-10 00:03:09.250 GCDTest[1285:51527] block2

2015-01-10 00:03:09.250 GCDTest[1285:51525] block1

2015-01-10 00:03:09.251 GCDTest[1285:51525]我是所有block运行完之后才运行的

2:

2015-01-10 00:04:41.431 GCDTest[1295:52381] block1

2015-01-10 00:04:41.431 GCDTest[1295:52379] block2

2015-01-10 00:04:41.431 GCDTest[1295:52380] block3

2015-01-10 00:04:41.432 GCDTest[1295:52380]我是所有block运行完之后才运行的


3:

2015-01-10 00:04:56.925 GCDTest[1300:52561] block1

2015-01-10 00:04:56.925 GCDTest[1300:52560] block3

2015-01-10 00:04:56.925 GCDTest[1300:52562] block2

2015-01-10 00:04:56.926 GCDTest[1300:52562]我是所有block运行完之后才运行的


该函数可用在当多任务更新数据完成之后通知UI更改界面。


今天就讲到学到着,下一张继续GCD的内容。




posted @ 2015-01-07 21:14  fineman  阅读(177)  评论(0编辑  收藏  举报