带你系统学习GCD(二)
来源:互联网 发布:淘宝东西会自动下架吗 编辑:程序博客网 时间:2024/06/06 19:30
欢迎走进夏天的Coding世界.
1. dispatch_barrier_async
下面通过代码对他进行解释
dispatch_queue_t queue = dispatch_queue_create("queue.example", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"-------------------1"); }); dispatch_async(queue, ^{ NSLog(@"-------------------2"); }); dispatch_async(queue, ^{ NSLog(@"-------------------3"); }); dispatch_async(queue, ^{ NSLog(@"-------------------4"); }); // dispatch_barrier_async(queue, ^{ // NSLog(@"I am a barrier"); // }); dispatch_async(queue, ^{ NSLog(@"-------------------5"); }); dispatch_async(queue, ^{ NSLog(@"-------------------6"); }); dispatch_async(queue, ^{ NSLog(@"-------------------7"); }); dispatch_async(queue, ^{ NSLog(@"-------------------8"); });
在开发的过程中某些功能实现的时候, 我们可能需要一些特定的表现形式, 比如我想让 在 1234 都执行结束之后, 在执行之后的操作(5678), 这样使用 dispatch_barrier_async 就可以实现了, 当然使用上篇文章说到的group和dispatch_set_target_queue(不太常用)结合使用也可实现, 但是源码会很复杂, 不推荐.
2. dispatch_sync
dispatch_sync函数 “async” 异步即非同步, sync即是同步.
假设一种场景: 在执行Main Dispatch Queue 时, 使用另外一种线程 Global Dispatch Queue 进行处理, 处理结束后立即使用所得到的结果 代码示例如下
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_sync(queue, ^{ // });
sync 容易造成死锁情况. 下面列举几个
情景1
dispatch_queue_t queue2 = dispatch_get_main_queue(); dispatch_sync(queue2, ^{ // NSLog(@"----------"); // 不会被执行 });
情景2
dispatch_queue_t queue3 = dispatch_get_main_queue(); dispatch_async(queue3, ^{ // dispatch_sync(queue3, ^{ NSLog(@"----------"); }); });
情景3
dispatch_queue_t queue4 = dispatch_queue_create("queue.example", DISPATCH_QUEUE_SERIAL); dispatch_async(queue4, ^{ // dispatch_sync(queue4, ^{ // NSLog(@"---------"); }); });
3. dispatch_apply
dispatch_apply 是 dispatch_sync 和 Dispatch Group 的关联API.
重复执行Block中代码. 示例如下
dispatch_queue_t queue5 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(5, queue5, ^(size_t i) { NSLog(@"i= %zu", i); });
其实Dispatch_apply函数与Dispatch_sync函数相同, 都是会等待处理执行结束所以推荐这样使用示例代码如下
dispatch_queue_t queue6 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 在Global Dispatch Queue 中非同步执行 dispatch_async(queue6, ^{ // Global Dispatch Queue 等待 Dispatch_apply 函数中的全部处理执行结束 dispatch_apply(5, queue6, ^(size_t index) { // NSLog(@"i = %zu", index); }); // 在Dispatch_apply 函数中的处理全部执行结束 // 在Main Dispatch Queue 中非同步执行 dispatch_async(dispatch_get_main_queue(), ^{ // 用户界面更新等 NSLog(@" end "); }); });
原文链接
4 0
- 带你系统学习GCD(二)
- 带你系统学习GCD(一)
- 带你系统学习GCD(三)
- 带你看看GCD
- 带你学习Jquery(二):选择器
- 带你全方位学习Picasso(二)
- gcd学习理解(二)
- gcd 学习总结 (二)
- 陌兮大魔王带你深入 学习ArrayList(二)
- GCD学习笔记(二):dispatch_queue_create
- 手把手带你自制Linux系统之二 简易Linux的制作
- 菜鸟不要怕,看一眼,你就会用GCD,带你装逼带你飞
- 带你学习JQuery:AJax_Load()
- 带你一起学习 jackson
- iOS系统GCD学习(1):介绍
- iOS系统GCD学习(2):Dispatch Queue
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(4):dispatch_group2
- JAVA8 Lambda表达式完全解析
- UESTC - 1041 Hug the princess(位运算&转换)好题
- 自言自语3
- 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
- Xftp5中文文件乱码
- 带你系统学习GCD(二)
- python3+scapy扫描获取局域网主机ip和mac
- Notes wk10 sensor & lbs
- Android的监听滞后性
- BestCoder Round #82 (div.1) 1002 HDU 5677 dp-类似多重背包的思想
- 解决ubuntu下Android Studio出现“aapt” IOException error=2, No such file or directory问题
- 找最长公共子串的函数
- 剑指offer刷题—斐波那契数列
- Linux命令缩写的解释