无论从事Android还是iOS开发,作为一个优秀的软件研发人员,对界面的操作能体现他的代码量,然而,对编程思想的理解还是体现在对底层接口的理解上,多线程编程则是无法回避的一个编程要点。然而,多线程编程入门比较容易,一般代码量不大,但是要深入理解难度却不小。iOS开发以Mac OS X 10.6 ,iOS 4为分界线,推出了GCD。
所谓GCD,即 Grand central Dispatch,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。注意:GCD并不是Cocoa框架的一部分。
很多人会问为什么要使用GCD?问的好,GCD的优势:
1、简单易用。NSThread的难用我在这里就不吐槽了。你们可以自己体会下。详情见:点击打开链接。
2、效率高。为什么GCD易用呢,还是牵扯到效率问题。因为开发者不需要操心效率问题;
3、性能优越。GCD自动根据系统负载增减线程数。这就减少了上下文切换,增加了计算效率。
使用GCD的场合:在ios 4.0+以上系统均可以使用,目前程序开发基本上不会考虑ios 4.0以下的系统了吧。
GCD中有3中队列类型,分别是:主队列,全局队列,自定义的队列。
队列主要分为:串行队列、并发队列。
GCD中的串行队列有:主队列、自定义队列
//主队列
dispatch_queue_t queque = dispatch_get_main_queue();
//自定义队列
dispatch_queue_t queue = dispatch_queue_create("com.abc.tcsl", NULL);
GCD中的并发队列有: 全局队列。
//并发队列
dispatch_queue_t quequet = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
下面,开始介绍GCD的常用方法,经过测试,特别好用啊。


首先,GCD可以写单例: (返回Teacher的单例)
+ (instancetype) getInstanceType;
{
static Teacher * teacher;
static dispatch_once_t onceToke;
dispatch_once(&onceToke, ^{
teacher = [[Teacher alloc] init];
});
return teacher;
}
GCD可以实现一个定时器:
//GCD定时器
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
//每2秒触发一次 误差是 0秒
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2ull * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(timer, ^{
dispatch_source_set_event_handler(timer, ^{
NSLog(@"wark up!!");
//取消计时器
dispatch_source_cancel(timer);
//关闭文件描述符
dispatch_source_set_cancel_handler(timer, ^{
NSLog(@"Cancel the task");
});
});
});
//启动多线程
dispatch_resume(timer);
[[NSRunLoop currentRunLoop] run];
其中,这句代码取消了定时器可以无限循环。
dispatch_source_cancel(timer);
GCD还可以让某一个block执行N次,简直是神器啊!
//执行某个方法N次
dispatch_apply(N, dispatch_get_global_queue(0,0), ^(size_t index)
{
[teacher noticeTeacher];
});
GCD队列可以暂停,可以恢复,但是对主队列无效!
队列暂停: dispatch_suspeng(queue);
队列恢复: dispatch_resume(queue); 没错,启动定时器也是用的这句。
GCD实现多线程的并发控制:
//实现多线程的并发控制
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"A事件开始执行");
});
dispatch_group_async(group, queue, ^{
NSLog(@"B事件开始执行");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"通知主线程开始执行任务");
});
[[NSRunLoop currentRunLoop] run];
执行结果:
2014-05-13 16:07:38.559 GCD[1198:1203] A事件开始执行
2014-05-13 16:07:38.561 GCD[1198:1203] 通知主线程开始执行任务