您的位置:首页 > 其它

GCD知识点概要总结

2015-10-22 15:59 253 查看
GCD总结:

GCD基础:

C语言的“并发技术”框架。

是苹果共公司为多核的并行运算提出的解决方案。

自动管理线程的生命周期(创建线程、调度线程、销毁线程等)

程序员只需要告诉GCD想要如何执行什么任务,不需要编写任何线程代码。注意以下生词的理解:dispatch:派遣调度

queue:队列 sync:同步 async:异步 concurrent:并发

GCD核心概念:

将“任务”添加到“队列”,执行任务的执行方式。

任务:用Block封装,预先准备好要执行的代码。

队列:包括自定义队列(串行队列,并发队列),主队列,全局队列。

****************************************************************

自定义队列:(包括串行队列和并发队列)

串行队列:一次只调度一个任务,一个任务调度完成后再调度下一个任务。dispatch_queue_create(“itcast”,NULL);

并发队列:可以同时调度多个任务。调度任务的方式取决于执行任务的函数。如果是异步执行,开启线程上限由GCD底层决定。方法如下:dispatch_queue_create(“itcast”,DISPATCH_QUEUE_CONCURRENT);

自定义队列的名称可以协助开发调试以及崩溃报告分析。

在MRC开发时,需要使用dispatch_release释放队列。示例如下:

#if !__has_feature(objc_arc)

dispatch_release(queue);

#endif

————————————————————————————

主队列:负责在主线程上调度任务,如果主线程上有任务执行,会等待主线程空闲后再调度任务执行。

主队列主要用于线程间通信,因为所有的UI更新都应该在主线程上更新。具体使用如下所示:

dispatch_async(dispatch_get_global_queue(0,0), ^{

// 耗时操作

// ……

dispatch_async(dispatch_get_main_queue, ^{

// 在主线程上更新UI

});

});

————————————————————————————

全局队列:苹果提供了全局队列,以方便程序员使用。

dispatch_get_global_queue(0,0);

IOS8开始使用QOS(服务质量)替代了原有的优先级。

获取全局队列时,直接传递0,可以实现IOS7和IOS8的适配。

全局队列与并发队列的对比:二者调度任务的方式相同。全局队列没有队列名称。在MRC开发中,全局队列不需要释放。

队列的优先级如下:

DISPATCH_QUEUE_PRIORITY_HIGH 2 高优先级。

DISPATCH_QUEUE_PRIOITY_DEFAULT 0 默认优先级,自定义队列的优先级都是默认优先级。

DISPATCH_QUEUE_PRIORITY_LOW -2 低优先级

DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级,是最低的。

QOS(服务质量)IOS8.0推出:具体有如下几个—>

QOS_CLASS_USER_INTERACTIVE 用户交互,会要求CPU尽可能的调度此任务,耗时操作不应该使用此服务质量。

QOS_CLASS_CLASS_USER_INITIATED 用户发起,比QOS_CLASS_USER_INTERACTIVE的调度级别低但是比默认级别高耗时操作不应该使用此服务质量,如果用户希望任务尽快执行完毕返回结果,可以选择此服务质量。

QOS_CLASS_DEFAULT 默认,此QOS不是为添加任务准备的,主要用于传送或恢复由系统提供的QOS数值时使用。

QOS_CLASS_UTILITY 实用,耗时操作可以使用此服务质量。

QOS_CLASS_BACKGROUND 后台,指定任务以最节能的方式运行。

QOS_CLASS_UNSPECIFIED 没有指定QOS。

————————————————————————————

执行任务的函数:包括同步,异步,以函数指针的方式调度。

同步:执行完这一句代码,在执行后续的代码就是同步。dispatch_sync。

异步:不必等待这一句代码执行完毕,就可以执行下一句代码就是异步。dispatch_async。

以函数指针的方式调度任务:dispatch_sync_f, dispatch_async_f,函数指针的传递类似于pthread。gcd中已经不再使用,只需要知道有助于面试。 dispatch+Block 才是gcd的主流。

————————————————————————————

小结:gcd能够开启线程,取决于执行任务的函数。

gcd具体开启线程的数量取决于调度任务的队列。

队列的选择:

串行队列:对执行效率要求不高。对执行顺序要求高。性能消耗小。

并行队列:对执行效率要求高,对执行顺序要求不高。性能消耗大。

如果不想再考虑非ARC即MRC中队列的释放,建议使用全局队列+异步任务。

****************************************************************

GCD的其他用法:包括延时执行,调度组,以及一次性代码块。

延时执行:diapatch_after(when, queue, block) 参数解析如下:when:表示从现在开始经过多少纳秒。

queue:调度任务的队列。

block:是异步执行任务。

调度组:

应用场景:需要在多个耗时操作执行完毕之后做统一的后续处理。

具体使用如下所示:

dispatch_group_t group = dispatch_group_create(); 创建调度组。

dispatch_group_async(group, queue, block)将队列添加到调度组,执行block任务。

dispatch_group_notify(group, dispatch_get_main_queue(),block)当调度组中的所有任务执行结束后,获得通知,统一做后续处理。

一次性:

应用场景:保证某段代码在程序运行过程中只被执行一次。在单例设计模式中被广泛应用。

dispatch_once。dispatch_once是线程安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: