美文网首页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梳理与总结(三)封装

    前面两节内容笔者主要对GCD的一些基本概念和常用API做了一个简单的梳理和归纳,对照笔者提供的Demo案例,相信读...

  • NSOperation & NSOperationQueue

    NSOperation与GCD的比较 1、NSOperation是GCD Objective-C对象的封装2、NS...

  • iOS多线程 - NSOperation和NSOperation

    在上一篇GCD的总结里有提到Apple对GCD进行了一层封装,从此有了NSOperation和NSOperatio...

  • D30:Block, GCD方式实现多线程

    一. block实现反向传值 二. block封装下载类型 三. GCD基本概念GCD是iOS4之后的技术, 是基...

  • iOS GCD封装Timer

    欢迎加QQ群: 457236811 ,我们一起来搞基! 一、为啥要用GCD封装Timer 为什么要用GCD封装Ti...

  • GCD 梳理

    1.线程和进程的区别进程是应用程序,是操作系统的基本结构,用来管理资源。线程是程序用来处理任务的,一个进程可以有一...

  • GCD 对比 NSOprationQueue

    GCD是面向底层的C语言的API,NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象。 区别 ...

  • iOS多线程-NSOperation

    NSOperation其实就是苹果对GCD的封装,把GCD封装成面向对象的编程,让开发者使用起来更加方便,简洁。 ...

  • GCD封装

    前言 移动设备上的应用性能取决于两个重要因素:硬件性能和软件质量。 硬件通常来说,CPU的核心频率决定了设备的处理...

  • GCD&NSOperation

    GCD&NSOperation 区别 NSOperation: 是 OC 的,是对 GCD 的封装 iOS 2.0...

网友评论

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

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