美文网首页iOS日常经验总结
GCD梳理与总结(三)封装

GCD梳理与总结(三)封装

作者: 牧羊的诗人 | 来源:发表于2020-08-17 15:42 被阅读0次

    前面两节内容笔者主要对GCD的一些基本概念和常用API做了一个简单的梳理和归纳,对照笔者提供的Demo案例,相信读者对GCD能够有个入门。通过梳理,我们可以发现,其实GCD的概念并不是很复杂,只是初学者往往会被它C语言的大串API以及网上各种很绕的概念给唬住了。剖开表象,看本质。GCD(Grand Central Dispatch)不过是多线程编程的一套API,一个多线程工具。工具本身不应该有难度。

    GCD的这套C语言API,相对来说使用起来比较繁琐,比较长,即使在有代码提示的情况,编码感受也较为不顺畅,在项目中不管是和OC还是swift风格上都有那么一点格格不入。所以笔者决定对一些常用的API进行封装,目的是在基本保持原有写法结构的基础上,尽量使其更加面向对象,更加简单易用。当然,笔者所封装的只是GCD的冰山一角,目的是应付95%的项目场景,所以还是建议读者们能够正本清源,在学习好GCD的基础上,批判性的选择使用,切不可依赖。下面我来谈谈我的封装思路,也期待广大网友能够在这套基础上继续舔砖加瓦。

    先上Demo

    前面两章我们谈到过三个概念:任务,队列,执行队列的方式。

    • 任务:没什么好说的,就是我们执行的耗时代码,我们依然保持把任务添加到block里的风格。

    • 队列:我们来看一下GCD的写法

    dispatch_queue_t queue = dispatch_queue_create("com.test.testQueue",     DISPATCH_QUEUE_SERIAL);
    

    虽说C语言没有对象的概念,但是这段代码要是用面向对面的概念来解读,不就是创建一个队列对象嘛。所以我们把队列封装成一个对象。

    #import <Foundation/Foundation.h>
    
    @interface GCDQueue : NSObject
    @property (strong, readonly, nonatomic) dispatch_queue_t dispatchQueue;
    
    #pragma mark - 获取系统队列
    + (GCDQueue *)mainQueue;
    + (GCDQueue *)globalQueue;
    + (GCDQueue *)globalQueue_highPriority;
    + (GCDQueue *)globalQueue_lowPriority;
    + (GCDQueue *)globalQueue_backgroundPriority;
    
    #pragma mark - 创建队列
    ///创建串行队列
    - (instancetype)initSerial:(NSString *)label;
    ///创建并行队列
    - (instancetype)initConcurrent:(NSString *)label;
    
    ///队列挂起
    - (void)suspend;
    ///队列恢复
    - (void)resume;
    @end
    
    • 执行队列的方式
      原本写法
     dispatch_sync(queue, ^{
          NSLog(@"同步执行的任务");
      });
    
      dispatch_async(queue, ^{
          NSLog(@"异步执行的任务");
      });
    

    dispatch_async,dispatch_after诸如此类更像是静态方法的调用,所以我们创建一个GCDDispatch类,将这些API用静态方法的写法统一封装起来,便于管理和记忆。

    ///同步执行
    + (void)sync:(GCDQueue *)queue execute:(dispatch_block_t)block;
    ///异步执行
    + (void)async:(GCDQueue *)queue execute:(dispatch_block_t)block;
    ///延迟执行
    + (void)afterSecs:(float)delta queue:(GCDQueue *)queue execute:(dispatch_block_t)block;
    ///重复执行
    + (void)apply:(NSInteger)times queue:(GCDQueue *)queue execute:(dispatch_block_num)block;
    ///栅栏(使用的队列应该是你自己创建的并发队列)
    + (void)barrier_async:(GCDQueue *)queue execute:(dispatch_block_t)block;
    ///同步栅栏(使用的队列应该是你自己创建的并发队列)
    + (void)barrier_sync:(GCDQueue *)queue execute:(dispatch_block_t)block;
    

    到这里基本的框架已经搭建完成,还有常用的如group,semaphore,timer等,都涉及到对象的概念,所以我们把这些都封装成对象,具体就不一一展开了,有兴趣的同学可以下载demo查看,也比较简单。

    如果本章对你入门和使用GCD有帮助,请帮忙给作者点亮小星星作为鼓励。

    相关文章

      网友评论

        本文标题:GCD梳理与总结(三)封装

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