GCD笔记

说明

Grand Gentral Dispatch(GCD) 异步执行任务的技术之一。将应用程序中记述的线程管理用的代码在系统级中实现。我们只需要定义需要执行的任务并追加到适当的Dispatch Queue中

Dispatch Queue

在执行处理包含两种Dispatch Queue,一种是等待现在执行中的处理Serial Dispatch Queue ,另一种是不等待现在执行中处理的Concurrent Dispatch Queue 。

创建Dispatch Queue

一.dispatch_queue_create

dispatch_queue_create方法第一个参数为创建的dispatch_queue_t的类型。第二个参数为dispatch_queue_t的名字,可以为NULL。建议命名,调试时会方便很多。

-.创建一个Serial Dispatch Queue,代码:

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);

虽然Serial Dispatch Queue是需要等待执行中处理的,但是dispatch_queue_create是可以创建的,创建的多个Serial Dispatch Queue的话会变成并行。每一个Serial Dispatch Queue都占一条线程。

-.创建一个Concurrent Dispatch Queue,代码:

dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue",DISPATCH_QUEUE_CONCURRENT);

dispatch_queue_cteate函数的返回值均是dispatch_queue_t类型。

为myConcurrentDispatchQueue指定执行的block函数。代码:

dispatch_async(myConcurrentDispatchQueue,^{NSLog(@"myConcurrentDispatchQueue的block");});

-.dispatch_release

部署版本低于iOS6.0时需要手动调用。虽然iOS5.0就推出了ARC模式,但是因为OS_OBJECT_USE_OBJC是在iOS6才推出的,所以最低部署版本需要iOS6才可以自动释放。

二.Main Dispatch Queue/Global Dispatch Queue

使用系统提供的Dispatch Queue。

-.Main Dispatch Queue

主线程中执行的Dispatch Queue。因为主线程只有一个,所以Main Dispatch Queue自然就是Serial Dispatch Queue。

追加到Main Dispatch Queue 的处理在主线程的RunLoop中执行,因此要将用户界面更新等一些必须在主线程中执行的处理追加到Main Dispatch Queue使用,如:网络请求中需要刷新界面显示进度,代码

dispatch_main_async_safe((^{

label.text=[NSString stringWithFormat:@"上传中%.0f%%",percent*100];

}));

-.Global Dispatch Queue

Global Dispatch Queue 是所有应用程序都能使用的Concurrent Dispatch Queue 。没有必要通过dispatch_queue_create函数逐个生存Concurrent Dispatch Queue,只要获取Global Dispatch Queue使用即可。

优先级介绍

Global Dispatch Queue(High Priority)               高

Global Dispatch Queue(Default Priority)           默认

Global Dispatch Queue(Low Priority)                低

Global Dispatch Queue(Background priority)  后台

后台优先级因为Global Dispatch Queue不能保证线程执行的实时性,因此优先级只是大致判断。在处理内容可有可无时,使用后台优先级,只能进行这种程度的区分。

获取方法如下

//Main Dispatch Queue 的获取方法

dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

//Global Dispatch Queue (高) 获取方法

dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

//Global Dispatch Queue (默认) 获取方法

dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

//Global Dispatch Queue (低) 获取方法

dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);

//Global Dispatch Queue (后台) 获取方法

dispatch_queue_t globalDispatchQueueBackgroud = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

对于Main Dispatch Queue和Global Dispatch Queue 执行dispatch_retch函数和dispatch_release函数不会引起任何变化,也不会有任何问题。

dispatch_set_target_queue

可以使多串并行的Queue变成串行执行

未完待续...

你可能感兴趣的:(GCD笔记)