Grand Central Dispatch(GCD)是异步执行任务的技术之一。摘自苹果的官方说明。
所谓异步执行任务的技术,也就是我们所说的多线程执行任务。
利用GCD我们可以节省很多时间进行任务处理。
首先,Dispatch Queue : 执行处理的等待队列。
种类有两种:
1.Serial Dispatch Queue - 等待现在执行中处理结束.
2.Concurrent Dispatch Queue - 不等待现在执行中处理结束.
接下来我们就看看都有哪些API?
1.dispatch_queue_create
dispatch_queue_t queue =
dispatch_queue_create("com.example.gcd.MyDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^{NSLog(@"block on MyDispatchQueue")});
dispatch_release(queue);
首先这是一个Concurrent Dispatch Queue的线程,在第二个参数指定的类型,如果想设定为Serial Dispatch Queue类型,则指定第二个参数为NULL,第一个参数是线程的名称,这个API返回一个dispatch_queue_t类型的变量。
在使用完成以后,我们需要通过dispatch_release来释放这个Dispatch Queue,因为Dispatch Queue并没有像Block那样具有作为对象来处理的技术。
注意事项:一个Serial Dispatch Queue同时只能执行1个追加处理,虽然Serial Dispatch Queue和Concurrent Dispatch Queue受系统资源的限制,但是dispatch_queue_create函数可以生成任意多个Dispatch Queue。
所以如果过多使用多线程,就会消耗大量的内存,引起大量的上下文切换大幅度降低系统的响应性能。
Serial Dispatch Queue 为了避免多线程编程问题之一---多个线程同时更新相同资源导致数据竞争时使用。
2.Main Dispatch Queue/Global Dispatch Queue
Main Dispatch Queue和Global Dispatch Queue是系统给我们提供的,不需要自己生成。
Main Dispatch Queue:是在主线程中执行的Dispatch Queue.因为主线程就一个,所以是Serial Dispatch Queue类型。
追加到Main Dispatch Queue的处理在主线程的runloop中执行。由于在主线程中执行,因此要将用户界面的界面更新等一些必须在主线程总执行的处理追加到Main Dispatch Queue使用。
Global Dispatch Queue:是系统提供的Concurrent Dispatch Queue类型的Dispatch Queue。
Global Dispatch Queue有4个执行优先级,分别是DISPATCH_QUEUE_PRIORITY_HIGH(高优先级)、DISPATCH_QUEUE_PRIORITY_DEFAULT(默认优先级)、DISPATCH_QUEUE_PRIORITY_LOW(低优先级)、DISPATCH_QUEUE_PRIORITY_BACKGROUND(后台优先级)
各种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);
//默认优先级
dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);
//低优先级
dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW , 0);
//后台优先级
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND , 0);
使用系统提供的这两种,并不需要我们进行release释放。
3.dispatch_set_target_queue
dispatch_queue_create函数生成的Dispatch Queue不管是何种类型,都使用与Global Dispatch Queue(默认优先级DISPATCH_QUEUE_PRIORITY_DEFAULT)具有相同的执行优先级。
变更线程的执行优先级要使用dispatch_set_target_queue函数。
在后台执行动作处理的Serial Dispatch Queue的生成方法如下:
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);
第一个参数是要变更执行优先级的Dispatch Queue,第二个参数是为第一个参数提供执行优先级的Global Dispatch Queue。
第一个参数如果指定Main Dispatch Queue 和 Global Dispatch Queue则不知道会出现什么状况,因此这些均不可指定。
dispatch_set_target_queue函数,不仅可以变更Dispatch Queue的执行优先级,还可以作成Dispatch Queue的执行阶层。
多个Serial Dispatch Queue同时执行是并行执行,在必须将不可并行执行的处理追加到多个Serial Dispatch Queue中时,使用dispatch_set_target_queue函数将目标指定为某一个Serial Dispatch Queue,即可防止处理并行执行。
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", NULL);
dispatch_queue_t myConcurrentDispatchQueue1 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_async(myConcurrentDispatchQueue, ^{
NSLog(@"----");
});
dispatch_async(myConcurrentDispatchQueue1, ^{
NSLog(@"~~~~");
});
[1123:85237] ~~~~
[1123:85236] ----
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", NULL);
dispatch_queue_t myConcurrentDispatchQueue1 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_queue_t myConcurrentDispatchQueue2 = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue1", NULL);
dispatch_set_target_queue(myConcurrentDispatchQueue, myConcurrentDispatchQueue2);
dispatch_set_target_queue(myConcurrentDispatchQueue1, myConcurrentDispatchQueue2);
dispatch_async(myConcurrentDispatchQueue, ^{
NSLog(@"----");
});
dispatch_async(myConcurrentDispatchQueue1, ^{
NSLog(@"~~~~");
});
[1136:87227] ----
[1136:87227] ~~~~
网友评论