Dispatch_group_t日常使用注意事项

参考博客:https://www.cnblogs.com/zhou--fei/p/6747938.html

一、dispatch_group_t相关属性介绍

1.dispatch_group_async(group, queue, block);将block任务添加到queue队列,并被group组管理

2.dispatch_group_enter(group);

声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1

3.dispatch_group_leave(group);

相应的任务执行完成,group组的任务数-1

4.dispatch_group_create();

创建一个group组

5.dispatch_group_wait(group1,DISPATCH_TIME_FOREVER);

当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的

任务执行完成后,线程才继续执行。

6.dispatch_group_notify(group1,queue1,block);

监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处

理。

二、常见用法的区别

1、dispatch_group_async(group, queue, block)和dispatch_group_notify(group1,

queue1,block)组合

这种组合下在执行同步任务时正常,但是不能保证queue中人物的执行顺序

在执行异步任务时不正常,会出现先执行dispatch_group_notify的情况

同步任务:

dispatch_queue_t queue1 =

dispatch_queue_create("dispatchGroupMethod1.queue1",

DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group1 =dispatch_group_create();

dispatch_group_async(group1, queue1, ^{

dispatch_sync(queue1, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);

}

});

});

dispatch_group_async(group1, queue1, ^{

dispatch_sync(queue1, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);

}

});

});

//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)

dispatch_group_notify(group1, queue1,^{

NSLog(@"Method1-全部任务执行完成");

});

2、dispatch_group_enter(group)和dispatch_group_leave(group)和

dispatch_group_notify(group1, queue1,block)组合

该组合下执行同步任务正常,可以使得queue中的任务block按照添加顺序依次执行

执行异步任务正常,但是不能保证queue中人物的执行顺序

同步任务代码

dispatch_queue_t queue2 =

dispatch_queue_create("dispatchGroupMethod2.queue2",

DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group2 = dispatch_group_create();

dispatch_group_enter(group2);

dispatch_sync(queue2, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);

}

dispatch_group_leave(group2);

});

dispatch_group_enter(group2);

dispatch_sync(queue2, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);

}

dispatch_group_leave(group2);

});

//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)

dispatch_group_notify(group2, queue2, ^{

NSLog(@"Method2-全部任务执行完成");

});

你可能感兴趣的:(Dispatch_group_t日常使用注意事项)