美文网首页
2019-11-20 iOS多线程之GCD(二)

2019-11-20 iOS多线程之GCD(二)

作者: 北你妹的风 | 来源:发表于2019-11-19 16:51 被阅读0次

    监听某个任务执行结束

    方法一、使用dispatch_block_wait,此方法会阻塞当前线程,不要放在主线程中。示例代码如下:

    dispatch_queue_t t = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);

    dispatch_block_t block1 = dispatch_block_create(0, ^{

            NSLog(@"task1 begin");

            [NSThread sleepForTimeInterval:3];

            NSLog(@"task1 end");

        });

     dispatch_async(t,^{

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block1);

            long  a =dispatch_block_wait(block1,DISPATCH_TIME_FOREVER);

            if(a ==0){

                NSLog(@"主线程刷新UI");

            }

            //此处代码被阻塞

            NSLog(@"被阻塞了");

        });

    方法二、使用dispatch_block_notify,此方法不会阻塞当前线程

    dispatch_async(t,^{

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block1);

            //此函数用于监听指定block执行结束,并在新的队列中执行另外一个操作。此函数不会阻塞当前线程

            dispatch_block_notify(block1, dispatch_get_main_queue(), ^{

                NSLog(@"主线程刷新UI");

            });

            NSLog(@"这段代码不会被阻塞");

        });

    因为异步执行+并发队列,会开辟新的子线程去执行任务,啥时候结束并不知道,所以需要以上两种方法来监听任务是否执行完毕

    监听一组任务执行结束

    可以使用dispatch_group来监听一组任务执行结束,这些任务可以没有任何关系。只要放在group中,即可实现监听。

    使用步骤如下:

    1、创建group        dispatch_group_t  group = dispatch_group_create();

    2、把任务加入group,该步骤有两种方式:dispatch_group_enter()/dispatch_group_leave、dispatch_group_async。第一种方式enter和leave要成对出现,并且enter要在leave之前调用。推荐使用第二种方式dispatch_group_async。

    dispatch_group_async(group,queue,task1);

    dispatch_group_async(group,queue,task2);

    //此处如果task1和task2有依赖关系的话,可以指定queue为串行队列

    3、监听group   使用函数dispatch_group_notify,指定任务组执行结束后所做的操作。

     dispatch_group_notify(group,mainQueue,refreshUITask)//这里假设等待任务组执行结束后,刷新UI

    取消某个任务

     使用函数dispatch_block_cancel来取消某个任务,对于正在执行的任务,该函数什么也不做,只对未执行的任务有效。

       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

           dispatch_async(t, block1);

           dispatch_async(t, block2);

          [NSThread sleepForTimeInterval:1];

           dispatch_block_cancel(block1);

            dispatch_block_cancel(block2);

        });

    相关文章

      网友评论

          本文标题:2019-11-20 iOS多线程之GCD(二)

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