美文网首页ios线程
iOS-GCD使用dispatch_group_enter处理线

iOS-GCD使用dispatch_group_enter处理线

作者: 晴天ccc | 来源:发表于2020-08-13 18:58 被阅读0次

    【前言】

    假设我们有这样一个需求:
    有三个异步操作(例:网络请求ABC),想在三个请求全部执行完返回结果后,再做其他操作。
    1、这三个网络请求,执行无序,并发执行。
    2、不论返回失败还是成功都算返回结果。
    那我们如何处理多线程的关系呢?

    【探究】

    如果满足上面的需求,使用GCD里面的dispatch_group_enterdispatch_group_leave来实现。这边我们使用了dispatch_after ()来模拟网络请求的异步耗时操作。

    dispatch_group_enter:通知 group,下个任务要放入 group 中执行了。
    dispatch_group_leave:通知 group,任务成功完成,要移除,与enter()成对出现。
    dispatch_group_notify:只要任务组完成才会调用,不完成不会调用。

    代码示例

    - (void)viewDidLoad {
        [super viewDidLoad]; 
        [self asynchronousTaskTest];
    }
    
    /** 异步任务测试 */
    - (void)asynchronousTaskTest{
    
        dispatch_group_t group = dispatch_group_create();
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // ****************** 任务A,异步执行1秒 ************************
        dispatch_group_enter(group);
        NSLog(@"任务A准备开始");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), queue, ^{
            NSLog(@"任务A准备结束-1");
            dispatch_group_leave(group);
            NSLog(@"任务A已经结束-1");
        });
        
        // ****************** 任务B,异步执行2秒 ************************
        dispatch_group_enter(group);
        NSLog(@"任务B准备开始");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
            NSLog(@"任务B准备结束-2");
            dispatch_group_leave(group);
            NSLog(@"任务B已经结束-2");
        });
           
        // ****************** 任务C,异步执行3秒 ************************
        dispatch_group_enter(group);
        NSLog(@"任务C准备开始");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
            NSLog(@"任务C准备结束-3");
            dispatch_group_leave(group);
            NSLog(@"任务C已经结束-3");
        });
         
        // ****************** 所有任务完成 ************************
        dispatch_group_notify(group, queue, ^{
            NSLog(@"所有任务全部完成");
        });
    
    }
    
    

    结果打印如下

    2020-08-13 10:20:28.737705+0800 CZProjectTestDemo[7511:1250505] 任务A准备开始
    2020-08-13 10:20:28.737815+0800 CZProjectTestDemo[7511:1250505] 任务B准备开始
    2020-08-13 10:20:28.737859+0800 CZProjectTestDemo[7511:1250505] 任务C准备开始
    2020-08-13 10:20:29.779764+0800 CZProjectTestDemo[7511:1250557] 任务A准备结束-1
    2020-08-13 10:20:29.780080+0800 CZProjectTestDemo[7511:1250557] 任务A已经结束-1
    2020-08-13 10:20:30.861132+0800 CZProjectTestDemo[7511:1250557] 任务B准备结束-2
    2020-08-13 10:20:30.861471+0800 CZProjectTestDemo[7511:1250557] 任务B已经结束-2
    2020-08-13 10:20:32.029025+0800 CZProjectTestDemo[7511:1250553] 任务C准备结束-3
    2020-08-13 10:20:32.029331+0800 CZProjectTestDemo[7511:1250553] 任务C已经结束-3
    2020-08-13 10:20:32.029353+0800 CZProjectTestDemo[7511:1250557] 所有任务全部完成
    

    注意这里任务ABC的延迟操作我设置的是1、2、3秒。如果更改秒数,则任务执行是无顺序的。

    相关文章

      网友评论

        本文标题:iOS-GCD使用dispatch_group_enter处理线

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