iOS8 GCD的使用
来源:互联网 发布:音效下载 知乎 编辑:程序博客网 时间:2024/05/22 14:55
GCD(Grand Central Dispatch)是一个基于C语言的多线程开发机制,相对于NSTread, NSOperation, 它使用起来非常简单,不需要关心哪个线程在运行,系统管理好了一切!
GCD的核心是调用队列(dispatch queues),这些队列的线程由GCD所在的系统管理。
GCD有三种队列:
主队列(Main Queue)
处理UI相关的方法。
并发队列(Concurrent queues)
有多个线程,操作进来之后它会将这些队列安排在可用的处理器上(一般在其他线程上,在主线程任务不多的时候,也可能把线程分配到主线程上),同时保证先进来的任务优先处理。可以同步或异步,使用dispatch_get_global_queue来产生并发队列。
串行队列(Serial queues)
只有一个线程(永远不会在主线程上),不论是同步还是异步调用都只会按照先进先出的顺序完成添加到队列的操作。使用
dispatch_queue_create 来产生串行队列。
下面举个简单的例子,我们要执行与UI无关的任务。
- (void)print1To1000{ //打印当前i和当前线程 for (int i = 0; i < 1000; i++) { NSLog(@"i = %d, Thread = %@",i, [NSThread currentThread]); };}- (void)viewDidLoad{ [super viewDidLoad]; //使用并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //1 同步调用 dispatch_sync(queue, ^{ [self print1To1000]; NSLog(@"print 99"); [self print1To1000]; }); //2 异步调用 dispatch_async(queue, ^{ dispatch_async(queue, ^{ [self print1To1000]; NSLog(@"print 99 second times"); }); [self print1To1000]; }); }从输出结果我们可以看到:
1.//1 只有一条线程,并且是主线程,这是因为前面所说的主线程还很空闲,所以分配到了主线程。也就是说,同步调用并发队列也只有一条线程。
2.//2 必须在 //1执行完毕后才能执行,这是因为//1阻塞了当前线程(也就是主线程),所以必须等//1结束了,才能在当前线程异步调用,当然//2是异步的不会阻塞当前线程;由于//2采用异步调用,在输出窗口看到print 99 second times最后才输出,也就是说输出变得无序了。
最后得到以下结论:
- 在GDC中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行。
- 串行队列可以按顺序执行,并行队列的异步方法无法确定执行顺序。
- UI界面的更新最好采用同步方法,其他操作采用异步方法。
http://www.cnblogs.com/kenshincui/p/3983982.html#GCD
- iOS8 GCD的使用
- iOS8 UIAlertContorller 的使用代码
- UIAlertController在ios8的使用
- IOS8 新增的UIVisualEffectView 使用
- 多线程GCD的使用
- GCD的使用.
- GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- iOS GCD的使用
- GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- GCD的使用
- 多线程GCD的使用
- GCD的使用
- 多线程GCD的使用
- Light oj 1038 - Race to 1 Again(概率dp)
- Aoj 2450 Do use segment tree【树链剖分】
- 欧几里得算法求两个正整数的最大公因子
- iOS <CoreLocation>定位框架的理解与运用
- Extjs4.2 model关联读复杂XML
- iOS8 GCD的使用
- 基类析构函数为虚函数的研究
- 作为码农,我们为什么要写作
- 数据库最最常用语句(10年工作笔记)
- happens-before规则解析
- yael for ubuntu 部署日志
- ZOJ - 2421 Recaman's Sequence(打表水题)
- swift函数
- iOS 多线程实例(NSThread售票窗口的模拟)