【iOS】GCD-简单使用

本文主在记录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基础知识集合

你可能感兴趣的:(【iOS】GCD-简单使用)