iOS 多线程-GCD队列组

iOS 多线程-GCD任务+队列.
iOS 多线程-GCD队列组.
iOS 多线程-GCD栅栏方法.

在实际的开发中,对于多线程的使用是多种多样的,因为需求的不同,处理逻辑也不同。
现在有两个耗时操作A和B,现在需要A和B都异步执行,当A和B都执行完成后再执行C。
这样的操作逻辑很常见,例如:一个界面需要展示两个接口请求的数据,需要两个接口全部请求完成才能刷新视图,展示数据。
对于这样的操作逻辑,对于这样的操作要求,我们可以使用队列组来完成。

队列组的使用

队列组的使用我分为3种方式:
1、通知方式:dispatch_group_notify
2、等待方式(堵塞方式):dispatch_group_wait
3、进入走出方式:dispatch_group_enter、dispatch_group_leave

无论是哪一种方式,都需要先去创建队列组、创建队列和创建任务。
1、创建队列组:

	//创建队列组
    dispatch_group_t group = dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

通知方式:dispatch_group_notify

- (void)queueGroupNotify{
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    //创建异步任务
    dispatch_group_async(group, queue, ^{
        //任务1
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务1的执行=====%d", i);
        }
    });
    
    //创建异步任务
    dispatch_group_async(group, queue, ^{
        //任务2
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务2的执行=====%d", i);
        }
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //任务3
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"回到主线程执行=====%d", i);
        }
    });
}

打印结果:
2020-03-18 16:11:26.065895+0800 GCDdemo[87505:1358550] 任务2的执行=====0
2020-03-18 16:11:26.065937+0800 GCDdemo[87505:1358551] 任务1的执行=====0
2020-03-18 16:11:28.071042+0800 GCDdemo[87505:1358550] 任务2的执行=====1
2020-03-18 16:11:28.071042+0800 GCDdemo[87505:1358551] 任务1的执行=====1
2020-03-18 16:11:30.075650+0800 GCDdemo[87505:1358551] 任务1的执行=====2
2020-03-18 16:11:30.075663+0800 GCDdemo[87505:1358550] 任务2的执行=====2
2020-03-18 16:11:32.077253+0800 GCDdemo[87505:1358470] 回到主线程执行=====0
2020-03-18 16:11:34.078721+0800 GCDdemo[87505:1358470] 回到主线程执行=====1
2020-03-18 16:11:36.079946+0800 GCDdemo[87505:1358470] 回到主线程执行=====2

从上面的打印结果可以看出:任务1和任务2是异步执行的,并且在任务1和任务2执行完成后才回到主线程执行。

等待方式(堵塞方式):dispatch_group_wait

- (void)queueGroupWait{
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    //创建异步任务
    dispatch_group_async(group, queue, ^{
        //任务1
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务1的执行=====%d", i);
        }
    });
    
    //创建异步任务
    dispatch_group_async(group, queue, ^{
        //任务2
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务2的执行=====%d", i);
        }
    });
    
    /**
     DISPATCH_TIME_NOW (0ull)            立即执行任务3,不等待
     DISPATCH_TIME_FOREVER (~0ull)  等待上面两个任务执行完成在执行任务3
     */
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    //任务3
    for (int i = 0; i < 3; i++) {
        [NSThread sleepForTimeInterval:2];
        NSLog(@"回到主线程执行=====%d", i);
    }
}

打印结果:
2020-03-18 16:21:22.095224+0800 GCDdemo[87837:1367632] 任务2的执行=====0
2020-03-18 16:21:22.095228+0800 GCDdemo[87837:1367630] 任务1的执行=====0
2020-03-18 16:21:24.099197+0800 GCDdemo[87837:1367632] 任务2的执行=====1
2020-03-18 16:21:24.099197+0800 GCDdemo[87837:1367630] 任务1的执行=====1
2020-03-18 16:21:26.101743+0800 GCDdemo[87837:1367630] 任务1的执行=====2
2020-03-18 16:21:26.101750+0800 GCDdemo[87837:1367632] 任务2的执行=====2
2020-03-18 16:21:28.103304+0800 GCDdemo[87837:1367440] 回到主线程执行=====0
2020-03-18 16:21:30.104813+0800 GCDdemo[87837:1367440] 回到主线程执行=====1
2020-03-18 16:21:32.106304+0800 GCDdemo[87837:1367440] 回到主线程执行=====2

从上面的打印结果可以看出:任务1和任务2是异步执行的,并且在任务1和任务2执行完成后才回到主线程执行。

进入走出方式:dispatch_group_enter、dispatch_group_leave

注意:dispatch_group_enter和dispatch_group_leave必须成对出现,这个组合等同于dispatch_group_async

- (void)queueGroupEnterLeace{
    //创建队列组
    dispatch_group_t group = dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    //进组
    dispatch_group_enter(group);
    //创建异步任务,这里不需要使用dispatch_group_async创建任务,使用dispatch_async
    dispatch_async(queue, ^{
        //任务1
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务1的执行=====%d", i);
        }
        //出组
        dispatch_group_leave(group);
    });
    
    //进组
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        //任务2
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"任务2的执行=====%d", i);
        }
        //出组
        dispatch_group_leave(group);
    });
    
    //通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //任务3
        for (int i = 0; i < 3; i++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"回到主线程执行=====%d", i);
        }
    });
}

打印结果:
2020-03-18 16:27:18.437480+0800 GCDdemo[88018:1373486] 任务2的执行=====0
2020-03-18 16:27:18.437479+0800 GCDdemo[88018:1373485] 任务1的执行=====0
2020-03-18 16:27:20.442395+0800 GCDdemo[88018:1373486] 任务2的执行=====1
2020-03-18 16:27:20.442395+0800 GCDdemo[88018:1373485] 任务1的执行=====1
2020-03-18 16:27:22.447306+0800 GCDdemo[88018:1373486] 任务2的执行=====2
2020-03-18 16:27:22.447331+0800 GCDdemo[88018:1373485] 任务1的执行=====2
2020-03-18 16:27:24.448925+0800 GCDdemo[88018:1373403] 回到主线程执行=====0
2020-03-18 16:27:26.450413+0800 GCDdemo[88018:1373403] 回到主线程执行=====1
2020-03-18 16:27:28.451925+0800 GCDdemo[88018:1373403] 回到主线程执行=====2

从上面的打印结果可以看出:任务1和任务2是异步执行的,并且在任务1和任务2执行完成后才回到主线程执行。

你可能感兴趣的:(iOS,OC,C语言)