美文网首页iOS Developer
【iOS】GCD-简单使用

【iOS】GCD-简单使用

作者: 24c41111e47b | 来源:发表于2016-07-06 14:48 被阅读75次

    本文主在记录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-简单使用

        本文链接:https://www.haomeiwen.com/subject/qzskjttx.html