(一)GCD 使用步骤
- 演示过程
- 创建任务 - block dispatch_block_t block myBlock= ^{ }
- 队列 dispatch_queue_t queue = dispatch_get_global_queue ( 0, 0 );
- 任务加入到队列 dispatch_async ( queue , myBlock )
- 开发过程使用
- dispatch_async ( dispatch_get_global_queue ( 0, 0 ) , ^ { } ) 异步执行
- 线程通讯 加入到主线程队列
- dispatch_async ( dispatch_get_main_queue() , ^{ } );
(二)队列分类
- 并发队列 sync 搭配 同步(主线程跑,有序) 搭配 异步(开启多个线程 , 无序,效率高)
- 串行队列 async 搭配 同步(主线程跑,有序) 搭配 异步(开一个线程, 有序)
- 主队列 永远是同步执行 有序 dispatch_get_main_queue()
- 搭配异步( 有序的 不开线程,主队列永远在主线程运行 )
- 搭配同步
- 当前代码为主线程时候, 永远不会执行,死锁
- 当前代码为子线程时候, 子线程会等待主线程执行完该代码后 在继续执行.
- 总结: 同步,异步 决定了是否需要开启线程
并发,串行 决定了任务是否有序执行 - sync注意:当加入到并发队列时候 当使用sync时候,不开线程 当前线程操作
-
全局并发队列 dispatch_get_global_queue( 0, 0) 第一个(表示优先级) 0为兼容老系统 就是并发队列 第二个 预留参数
(三)示例程序
-(void)demo{
//1.创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
//(1)任务1,2在子线程顺序执行-->串行队列,异步执行
dispatch_async(serialQueue, ^{
[self task:1];
});
dispatch_async(serialQueue, ^{
[self task:2];
});
dispatch_sync(serialQueue, ^{
//(2)完成之后通知主线程执行任务3,4并顺序执行->主队列,异步执行
dispatch_async(dispatch_get_main_queue(), ^{
[self task:3];
});
dispatch_async(dispatch_get_main_queue(), ^{
[self task:4];
});
});
//(3)完成之后开启任务5,6,7并发执行->并发队列,异步执行
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self task:5];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self task:6];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self task:7];
});
});
}
//任务
-(void)task:(int)number{
NSLog(@"task %d->%@",number,[NSThread currentThread]);
}