本文主在记录GCD的简单使用,更多高级使用请参考文后链接。
工具:Xcode
GCD使用分为两部分,任务分发和添加到队列
任务分发
任务分发分同步分发和异步分发,同步分发会阻塞当前线程,直到任务分发并执行完成,在主线程中;异步分发不会阻塞线程,可以异步分发任务并异步执行,不影响下面的代码执行,异步分发到主队列不开启新线程,异步分发到全局队列会开启新线程。
同步分发任务
dispatch_sync(dispatch_queue_t _Nonnull queue, ^{
//code
});
异步分发任务
dispatch_async(dispatch_queue_t _Nonnull queue, ^{
//code
});
添加到队列(Dispatch Queue)
队列(Dispatch Queue)是一个任务执行队列,可以让你异步或同步地执行多个Block或函数。Dispatch Queue是FIFO的,即先入队的任务总会先执行。目前有三种类型的Dispath Queue:
- 串行队列 (Serial dispatch queue)
- 并行队列 (Concurrent dispatch queue)
- 主队列 (Main dispatch queue)
串行队列
串行队列一次只能处理一个任务,可以由用户调用dispatch_queue_create创建:
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
并行队列
并行队列可以同时处理多个任务,在不得以的情况下可以用dispatch_queue_create创建,但一般我们都要用系统预定义的并行队列,即全局队列(Global Concurrent Dispatch Queues)。目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们。
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_global_queue第一个参数是队列的优先级,分别对应四个全局队列:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
第二个参数是系统预保留参数,设为0即可。
主队列
主队列是一个特殊的队列,它是系统预定义的运行在主线程的一个Dispatch Queue。可以通过dispatch_get_main_queue来获取唯一的主队列。主队列一般运行一些需要与主线程同步的一些短时任务。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
队列与任务的结合
函数 | 全局并发队列 | 手动创建串行队列 | 主队列 |
---|---|---|---|
同步(sync) | 没有开启新线程 串行执行任务 | 没有开启新线程 串行执行任务 | 没有开启新线程 串行执行任务 |
异步(async) | 有开启新线程 并发执行任务 | 有开启新线程 串行执行任务 | 没有开启新线程 串行执行任务 |
如:
同步分发到主队列
dispatch_sync(dispatch_get_main_queue(), ^{
//不开启新线程 阻塞线程 同步分发同步执行
});
同步分发到全局队列
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//不开启新线程 串行执行
});
异步分发到主队列
dispatch_async(dispatch_get_main_queue(), ^{
//不开启新线程 串行执行
});
异步分发到全局队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//有开启新线程 并发执行任务
});
更多GCD相关文章
并发编程之Operation Queue和GCD
GCD基础知识集合