GCD梳理与总结——封装

时间:2022-07-24
本文章向大家介绍GCD梳理与总结——封装,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

通过梳理,我们可以发现,其实GCD的概念并不是很复杂,只是初学者往往会被它C语言的大串API以及网上各种很绕的概念给唬住了。剖开表象,看本质。GCD(Grand Central Dispatch)不过是多线程编程的一套API,一个多线程工具。工具本身不应该有难度。

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

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

  • 任务:没什么好说的,就是我们执行的耗时代码,我们依然保持把任务添加到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有帮助,请帮忙给作者点一下作为鼓励。