美文网首页
Dispatch_group_t日常使用注意事项

Dispatch_group_t日常使用注意事项

作者: 猿二胖 | 来源:发表于2017-11-15 10:23 被阅读0次

    参考博客: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日常使用注意事项

          本文链接:https://www.haomeiwen.com/subject/gylcvxtx.html