说明
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变成串行执行
未完待续...