GCD的简单应用

2016-08-10  本文已影响4人  ___1o_8o

1.耗时操作
通常我们需要做耗时操作的时,可以直接使用下面代码,GCD会自动帮我们创建线程进行处理

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //耗时操作
        NSLog(@"1");
        dispatch_async(dispatch_get_main_queue(), ^{
            //更新UI
            NSLog(@"2");
        });
    });

2.阻塞式(有先后顺序)操作
若遇到任务有先后顺序,可以考虑barrier,阻塞式
eg: 流程任务,需要多个网络请求的值进行汇总,再进行网络请求,再汇总。
下面的任务顺序就是 123顺序任意改变 接着永远是4444444 再 567顺序任意改变 最后永远是8888888

    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"444444");
            dispatch_async(queue, ^{
                NSLog(@"5");
            });
            dispatch_async(queue, ^{
                NSLog(@"6");
            });
            dispatch_async(queue, ^{
                NSLog(@"7");
            });
            dispatch_barrier_async(queue, ^{
                    NSLog(@"888888");
        });
    });

这样写也是可以的

    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"444444");

    });
    dispatch_async(queue, ^{
        NSLog(@"5");
    });
    dispatch_async(queue, ^{
        NSLog(@"6");
    });
    dispatch_async(queue, ^{
        NSLog(@"7");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"888888");
    });

3.1调度组:一组代码完成后统一做处理
dispatch_group_notify是异步的来监听group调度组中的人物完成情况,若所有人物完成则会调用notify中的任务,但是notify后面的任务还是会先执行,但后面的任务在代码中是主线程不是子线程

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t global = dispatch_get_global_queue(0, 0);
    
    dispatch_group_async(group, global, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务一:%@",[NSThread currentThread]);
        
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务二:%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务三:%@",[NSThread currentThread]);
    });
    
    dispatch_group_notify(group, global, ^{
        NSLog(@"一二三都完成");
    });
    
    NSLog(@"异步代码");

3.2调度组
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
是同步的等待,当调度组中的任务全部执行完毕的时候才会调用wait后面的语句,

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t global = dispatch_get_global_queue(0, 0);
    
    dispatch_group_async(group, global, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务一:%@",[NSThread currentThread]);
        
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务二:%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务三:%@",[NSThread currentThread]);
    });
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    NSLog(@"异步代码");

调度组总结:
wait可以理解为sync
notify可以理解为async

调度组还有对应的 enter leave方法 不过并不是很实用

上一篇下一篇

猜你喜欢

热点阅读