前言:回顾下一直在使用的GCD中的一些概念.
dispatch_queue_t 队列
队列:顾名思义,就是排队,什么排队?当然是要执行的任务进行排队.这个队列要通过一个桥,是一列通过还是多列同时通过呢?这就队列中任务的执行方式.串行还是并行.
- 创建一个串行队列
dispatch_queue_t quene = dispatch_queue_create(@"queue1", DISPATCH_QUEUE_SERIAL);
- 创建一个并行队列
dispatch_queue_t quene = dispatch_queue_create(@"queue1", DISPATCH_QUEUE_CONCURRENT);
并行队列中有一个全局并行队列:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
该队列的参数:第一个是优先级,第二个待定.如果不想自己创建队列,直接使用这个就可以,这个是系统默认创建的一个全局并发队列.
其中 queue1 是这个队列的名字,也是唯一标识.DISPATCH_QUEUE_SERIAL(串行)和DISPATCH_QUEUE_CONCURRENT(并行)是队列的执行的方式,
队列 怎么用?
//串行队列
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
//加入俩个异步操作
dispatch_async(queue, ^{
for(int i=0;i<5;i++ ){
NSLog(@" 1当前线程 %@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for(int i=0;i<5;i++ ){
NSLog(@" 2当前线程 %@",[NSThread currentThread]);
}
});
输出结果:第一个for循环结束,进行第二个.
//并行队列
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
//加入俩个异步操作
dispatch_async(queue, ^{
for(int i=0;i<5;i++ ){
NSLog(@" 1当前线程 %@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for(int i=0;i<5;i++ ){
NSLog(@" 2当前线程 %@",[NSThread currentThread]);
}
});
输出结果:这个就无序输出了.
注意!!!!!!! 下面的 会 死锁 死锁 死锁
dispatch_sync(dispatch_get_main_queue(), ^{
})
说完 dispatch_queue_t 队列 接下来我们说下 dispatch_group_t
dispatch_group_t 组
首先创建一个 组:
dispatch_group_t group = dispatch_group_create();
组就是用来装队列用的,一般的使用场景线程间的通讯.就是多个异步操作之间的依赖关系.组内每一个队列执行完成之后,会发送一个通知:
dispatch_group_notify
得到这个通知 你可以 回调到主线程更新UI 也阔以 进行接下来的其他操作. queue 可以是多个 queue1 queue2 queue3 也阔以是一个 不影响结果
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
for(int i=0;i<10;i++ ){
NSLog(@" 0当前线程 %@",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for(int i=0;i<10;i++ ){
NSLog(@" 1当前线程 %@",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for(int i=0;i<10;i++ ){
NSLog(@" 2当前线程 %@",[NSThread currentThread]);
}
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"完成");
});
在所有线程执行完成之后会得到 完成的通知.