GCD的理解与应用

一. GCD应用中主要分为函数和队列
函数分为:同步函数,异步函数
同步函数 dispatch_sync(dispatch_queue_t queue, dispatch_block_t blcok);
异步函数 dispatch_async(dispatch_queue_t queue, dispatch_block_t blcok);
队列分为:自己创建的串行队列, 全局并行丢列, 主队列
自己创建的队列 dispatch_queue_t serialQueue = dispatch_queue_create("serial", nil);
全局并行队列 dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue();

同步函数与异步函数区别:同步函数不能开辟子线程,异步函数能开辟子线程.
1.当调用同步函数时,不管队列是串行队列还是并行队列,同步函数的任务都是按顺序加到队列中 串行执行.

2.当调用同步函数时,如果队列是主队列会造成死锁,所以同步函数不能和主队列一起使用.

3.当调用异步函数时, 如果是串行队列只开辟一条子线程,将异步函数的任务加入到串行队列中按顺序执行.

4.当调用异步函数,如果是并行队列,每一个任务加到队列中都是开启一个新子线程运行.

5.当调用异步函数时,如果队列是主队列,因为主队列中只有一条主线程,所以任务都是加入主队列中的主线程按顺序执行. 主线程在IOS中是UI线程.

6.同步函数不开辟新线程,所以不管队列是串行还是并行,当前任务的线程都是主线程.

二. dispatch_group的应用与理解
//dispatch_group 相当于是一个组容器,将任务异步提交到组容器中, 任务可以分别在不同的队列上面执行.
//创建组
dispatch_group_t group = dispatch_group_create();
//需求 任务1,任务2 异步串行 任务3,任务4异步并行 任务5在所有的都完成后在主线程执行
分析: 任务1, 任务2 串行 任务2一定在任务1之后执行, 任务5一定是最后执行, 任务3和任务4位置不确定
//把异步任务提交到任务组扇面
dispatch_queue_t serialQueue11 = dispatch_queue_create("serial", 0);
dispatch_group_async(group, serialQueue11, ^{
NSLog(@"任务1 %@",[NSThread currentThread]);
});
dispatch_group_async(group, serialQueue11, ^{
NSLog(@"任务2 %@",[NSThread currentThread]);
});

dispatch_group_t globalQueue11 = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, globalQueue11, ^{
    NSLog(@"任务3 %@",[NSThread currentThread]);
});
dispatch_group_async(group, globalQueue11, ^{
    NSLog(@"任务4 %@",[NSThread currentThread]);
});

dispatch_group_t mainQueue11 = dispatch_get_main_queue();
dispatch_group_notify(group, mainQueue11, ^{
    NSLog(@"任务5 %@", [NSThread currentThread]);
});

打印结果 验证结果正确
2019-02-18 02:15:25.977950+0800 排序算法[10535:363040] 任务3 {number = 4, name = (null)}
2019-02-18 02:15:25.977971+0800 排序算法[10535:363042] 任务1 {number = 3, name = (null)}
2019-02-18 02:15:25.977984+0800 排序算法[10535:363043] 任务4 {number = 5, name = (null)}
2019-02-18 02:15:25.978249+0800 排序算法[10535:363042] 任务2 {number = 3, name = (null)}
2019-02-18 02:15:26.711287+0800 排序算法[10535:362985] 任务5 {number = 1, name = main}

你可能感兴趣的:(GCD的理解与应用)