65 GCD基本使用
2015-08-27 00:41
393 查看
1>任务函数: 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行(在主队列中除外) 2>队列的种类: GCD的队列可以分为2大类型 并发队列(Concurrent Dispatch Queue) 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在异步(dispatch_async)函数下才有效 串行队列(Serial Dispatch Queue) 让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务) GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 3>并发队列的使用: GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建 使用dispatch_get_global_queue函数获得全局的并发队列 dispatch_queue_t dispatch_get_global_queue( dispatch_queue_priority_t priority, // 队列的优先级 unsigned long flags); // 此参数暂时无用,用0即可 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列 全局并发队列的优先级 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中) #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 4>串行队列的使用: GCD中获得串行有2种途径 使用dispatch_queue_create函数创建串行队列 dispatch_queue_t dispatch_queue_create(const char *label, // 队列名称 dispatch_queue_attr_t attr); // 队列属性,一般用NULL即可 dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 创建 dispatch_release(queue); // 非ARC需要释放手动创建的队列 使用主队列(跟主线程相关联的队列) 主队列是GCD自带的一种特殊的串行队列 放在主队列中的任务,都会放到主线程中执行 使用dispatch_get_main_queue()获得主队列 dispatch_queue_t queue = dispatch_get_main_queue(); 5>任务和队列的组合: sync + 并发队列 :不能开启新线程,串行执行(先进先出) sync + 串行队列 :不能开启新线程,串行执行(先进先出) sync + 主队列 : 不能开启新线程,串行执行(先进先出) async + 并发队列 :有开启新线程(多条) 并发执行任务(先进先出) async + 串行队列 :有开启新线程(一条) 串行执行任务(先进先出) async + 主队列 :没有开启新线程 串行执行任务(先进先出) 6> 死锁情况: 当前是主线程的情况下:sync + 主队列 : 死锁,因为当前方法是在主线程中执行,新建了一个同步主线程的任务,当前方法会等待任务执行完之后继续往下执行,而任务会等待当前方法执行完之后执行,这样就会形成一个相互等待的死锁。仅仅是在主线程情况下,子线程情况下ok。 当前是主线程的情况下:async + 主队列 :不会死锁,当前方法会继续往下执行,当前执行完之后,执行任务!
相关文章推荐
- Oracle索引,B树索引、哈希索引等
- zoj 3885 The Exchange of Items 【最小费用最大流】
- 十四、第三章再续:快速选择SELECT算法的深入分析与实现
- 十三、通过浙大上机复试试题学SPFA 算法
- 十五、多项式乘法与快速傅里叶变换
- shiro android
- Linux磁盘与文件系统管理详细总结
- Filter 编码问题
- 快速排序算法
- 十二之续、快速排序算法的深入分析
- Opengl中矩阵和perspective/ortho的相互转换
- iOS部分-UI基础控件 - 01天 入门 第04课 加法计算器小结
- c 语言用递归法倒序字符串
- 十二之再续:快速排序算法之所有版本的c/c++实现
- iOS部分-UI基础控件 - 01天 入门 第03课 IBAction&IBOutlet
- 数制
- 优化资源配置读后感
- 猜拳游戏 3.0升级版
- 输入3个字符串,按字符串由短到长的顺序输出
- Hadoop(二)——分布式集群搭建