GCD的工作原理是:让任务平行排队,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
dispatch queue分为下面三种:
Serial(串行队列):又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。
当创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
Concurrent(并行队列):队列中可以并发地执行多个任务,但是执行完成的顺序是随机的。
系统同时提供给好几个并发队列。它们叫做全局调度队列(Global Dispatch Queues) 。
目前的四个全局队列有着不同的优先级:background、low、default 以及 high。Apple 的 API 也会使用这些队列,所以添加的任何任务都不会是这些队列中唯一的任务。
Main dispatch queue:它是全局可用的serial queue,它是在应用程序主线程上执行任务的。
dispatch_once_t:保证执行唯一:例如创建单例
//静态变量,保证只有一份实例,才能确保只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//单例代码
});
//串行队列
dispatch_queue_t queue = dispatch_queue_create(
"Queue"
, DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_t queue = dispatch_queue_create(
"Queue"
, DISPATCH_QUEUE_CONCURRENT);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
do .......
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomthing];
});
});
首先将工作从主线程移到全局线程。因为这是一个 dispatch_async() ,Block 会被异步地提交,意味着调用线程地执行将会继续。
dispatch_async 添加一个 Block 到队列后就立即返回了。任务会在之后由 GCD 决定执行。当需要在后台执行一个基于网络或 CPU 紧张的任务时就使用 dispatch_async ,这样就不会阻塞当前线程。
dispatch_sync(): 同步地提交工作并在返回前等待它完成。使用 dispatch_sync 跟踪你的调度障碍工作,或者当你需要等待操作完成后才能使用 Block 处理过的数据。
dispatch_sync() 和 dispatch_async() 实例分析
dispatch_sync例:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
- NSLog(@"First Log");
- });
- NSLog(@"Second Log");
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"First Log");
});
NSLog(@"Second Log");
}