Dispatch Queue
dispatch Queue(queue,^{
//想执行的任务
});
dispatch_queue_create
通过 GCD 的 API 生成 Dispatch Queue.
dispatch_queue_t mySerialDispatchQueue =
dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL);
第一个参数线程的名称,第二参数为 Dispatch Queue 的类型,NULL 表示为 Serial Dispatch 。
生成 Concurrent Dispatch Queue 线程则第二个参数为 CONCURRENT_DISPATCH_QUEUE ;
一个 Serial Dispatch 使用一个线程,等待现在执行中处理结束;一个 Concurrent Dispatch Queue 可以使用多个线程,不等待现在执行中的处理结束。
使用 dispatch_release() 释放queue;
Main Dispatch Queue / Global Dispatch Queue
Main Dispatch Queue 是主线程中执行的Dispatch Queue,为Serial Dispatch。
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
Global Dispatch Queue 是所有应用程序都能够使用的 Concurrent Dispatch Queue ,有四个优先级。
dispatch_queue_t globalDispatchQueueBackground =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
Dispatch Queue 的种类
名称 | 种类 | 说明 |
---|---|---|
Main Dispatch Queue | Serial Dispatch Queue | 主线程执行 |
Global Dispatch Queue (High Priority) | Concurrent Dispatch Queue | 执行优先级:高 |
Global Dispatch Queue (Default Priority) | Concurrent Dispatch Queue | 执行优先级:默认 |
Global Dispatch Queue (Low Priority) | Concurrent Dispatch Queue | 执行优先级:低 |
Global Dispatch Queue (Background Priority) | Concurrent Dispatch Queue | 执行优先级:后台 |
dispatch_set_target_queue
用 dipatch_queue_create 函数生成的 Dispatch Queue 都是默认优先级的。而使用 dispatch_set_target_queue 可以变更优先级。
dispatch_queue_t mySerialDispatchQueue =
dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL);
dispatch_queue_t globalDispatchQueueBackground =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
dispatch_set_target_queue(mySerialDispatchQueue,globalDispatchQueueBackground);
dispatch_set_target_queue 函数的指定第一个参数的优先级与第二个参数的优先级相同。
dispatch_after
dispatch_after 函数可以指定在一段时间后运行。
指定在3秒后运行
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),^{
NSLog(@"waited at least three seconds.");
});
Dispatch Group
往一个 Serial Dispatch Queue 中加入多个block,会按顺序执行,在最后填加结束处理很容易实现。但是 Concurrent Dispatch Queue 或者多个 Dispatch Queue 同时使用,在最后填加结束处理就颇为麻烦。
这种情况下就可以使用 Dispatch Group 。
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(@"blk0");});
dispatch_group_async(group,queue,^{NSLog(@"blk1");});
dispatch_group_async(group,queue,^{NSLog(@"blk2");});
dispatch_group_notify(group,dispatch_getmain_queue(),^{NSLog(@"done");});
dispatch_release(group);
执行顺序
blk1
blk2
blk0
done
前三个顺序不定,但是done一定是在最后输出。
dispatch_group_wait(group,DISPATCH_TIME_FOREVER) 可设置等待时间,DISPATCH_TIME_FOREVER 为永久等待,即是group未执行完则一直等待。
返回值为0和1,0表示执行结束。
dispatch_barrier_async
dispatch_barrier_async 函数回等待追加到 Concurrent Dispatch Queue 上的并行执行的处理全部结束之后,再将指定的处理追加到该 Concurrent Dispatch Queue 中。然后在由 dispatch_barrier_async 函数追加的处理执行完毕后,Concurrent Dispatch 才恢复为一般的动作,然后又开始执行。
dispatch_async(queue,blk0_for_reading);
dispatch_async(queue,blk1_for_reading);
dispatch_async(queue,blk2_for_reading);
dispatch_async(queue,blk3_for_reading);
//等待上面的执行完再执行 dispatch_barrier_async
dispatch_barrier_async(queue,blk_for_writing);
//等待 dispatch_barrier_async 执行完再执行下面的
dispatch_async(queue,blk4_for_reading);
dispatch_async(queue,blk5_for_reading);
dispatch_async(queue,blk6_for_reading);
dispatch_async(queue,blk7_for_reading);
dispatch_barrier_async追加的处理同时只执行1个。
dispatch_sync
async 是非同步的意思,sync 则是同步的意思。用 dispatch_sync 添加的 Dispatch Queue 会顺序执行,即是在追加Block结束之后,dispatch_sync函数会一直等待。
dispatch_apply
dispatch_apply 函数是 dispatch_sync 和 Dispatch Group的关联 API。该函数按指定的次数将指定的Block追加到指定的 Dispatch Queue 中,并等待全部处理执行结束。
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_apply(10, queue, ^(size_t index){
NSLog(@"@zu",index);
});
NSLog(@"done");
执行顺序
4
1
0
3
5
2
6
8
9
7
done
dispatch_apply() 函数第一个参数为重复次数,第二个参数为追加对象 Dispatch Queue ,第三个参数为追加处理。
dispatch_suspend / dispatch_resume
dispatch_suspend用于挂起Dispatch Queue。
dispatch_resume用于恢复Dispatch Queue。
dispatch_suspend(queue);
...
dispatch_resume(queue);
dispatch_once
dispatch_once函数是保证应用程序执行一次指定处理的API。
static dispatch_once_t pred;
dispatch_once (&pred,^{
//初始化
});