学习GCD的一些基本用法
来源:互联网 发布:充电宝推荐 知乎 快充 编辑:程序博客网 时间:2024/06/05 19:14
1.使用dispatch_get_global_queue创建一个并行队列,系统默认给我们提供了四种优先级的global Queue,每一个Queue都是一个单例
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_get_global_queue创建并行队列包含四种优先级,DISPATCH_QUEUE_PRIORITY_DEFAULT优先级是中级。
2.获取当前主线程,由打印我们可以看到主线程是一个单例
dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_async(mainQueue, ^{ NSLog(@"%@",[NSThread currentThread]); }); dispatch_queue_t mainQueue1 = dispatch_get_main_queue(); dispatch_async(mainQueue1, ^{ NSLog(@"%@",[NSThread currentThread]); }); dispatch_queue_t mainQueue2 = dispatch_get_main_queue(); dispatch_async(mainQueue2, ^{ NSLog(@"%@",[NSThread currentThread]); }); dispatch_queue_t mainQueue3 = dispatch_get_main_queue(); dispatch_async(mainQueue3, ^{ NSLog(@"%@",[NSThread currentThread]); });3.创建一个自定义的串行队列,DISPATCH_QUEUE_SERIAL表示串行队列
dispatch_queue_t customQueue = dispatch_queue_create("simeng", DISPATCH_QUEUE_SERIAL); dispatch_async(customQueue, ^{ for (int i = 0; i < 100; i++) { NSLog(@"********%@",[NSThread currentThread]); } }); dispatch_async(customQueue, ^{ for (int i = 0; i < 100; i++) { NSLog(@"------%@",[NSThread currentThread]); } });
由打印我们可以看到,它是先打印100个带“*****”的,然后打印100个带“------”的
4.下面是自定义并行队列,并行队列的关键字是DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t queue = dispatch_queue_create("com.simeng", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ for (int i = 0; i < 100; i++) { NSLog(@"********%@",[NSThread currentThread]); } }); dispatch_async(queue, ^{ for (int i = 0; i < 100; i++) { NSLog(@"++++++%@",[NSThread currentThread]); } });打印可以看到,“*****”和“++++”是交错打印的,并没有顺序。
5.在介绍一个barrier,相当于一堵墙,就是之前的执行完成后,才会执行后面的
dispatch_queue_t queue = dispatch_queue_create("com.simeng", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ //1. for (int i = 0; i < 1000; i++) { NSLog(@"-----%d",i); } }); dispatch_barrier_async(queue, ^{ //2. for (int i = 0; i < 1000; i++) { NSLog(@"barrier"); } }); dispatch_async(queue, ^{ // 3. for (int i = 0; i < 1000; i++) { NSLog(@"@@@@@@@@%d",i); } });那么我们这创建了一个并行队列,开辟两个线程1和3,正常情况下1和3是并发执行的,但是我们在1和3之间开辟一个barrier线程,运行一下,我们打印可以看到1和3没有并发执行,而是按1、2、3顺序执行。
dispatch_queue_t queue = dispatch_queue_create("aaa", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{ NSLog(@"bbb"); dispatch_sync(queue, ^{ NSLog(@"ccc"); }); NSLog(@"ddd"); });打印可以看到只打印了“bbb”,而不会往下执行,主线程也是同步
dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"ddd"); });我们可以发现”ddd“没有打印,同样是形成了死锁
常用网络请求数据多线程执行模型
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //子线程请求数据 //更新数据模型 dispatch_sync(dispatch_get_main_queue(), ^{ //主线程刷新ui }); });先介绍写,以后继续补充
0 0
- 学习GCD的一些基本用法
- GCD的基本用法
- GCD的一些用法
- IOS的GCD基本用法
- 关于GCD的一些用法
- iOS多线程GCD的基本用法
- NSThread、NSOperationQueue、GCD的基本用法
- GCD基本用法
- Log4的一些基本用法
- ListBox的一些基本用法
- Hibernate的一些基本用法
- hadoop的一些基本用法
- Git 的一些基本用法
- UITableView的一些基本用法
- UIButton的一些基本用法
- #define 的一些基本用法
- intent的一些基本用法
- Thread一些基本的用法
- GDI绘制填充图一
- c++中的虚基类
- PHP版本VC6和VC9、Non Thread Safe和Thread Safe的区别
- C#中的Linq技术标准操作符大全(转)
- 第十三周项目2-成绩处理
- 学习GCD的一些基本用法
- 输出字符串的排列数和组合数
- 中缀表达式转后缀表达式
- 北京航空航天大学2014第五次上机解题报告
- linux 系统移植
- Java数组
- 用U盘安装Linux图解
- spark程序异常:Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
- JLINK RTT,完爆各种printf形式,从此swo是路人