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