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有帮助,请帮忙给作者点一下作为鼓励。
- 重温快速排序(r4笔记第73天)
- Java基础-17(01)总结,TreeSet,LinkHashSet
- 海量数据迁移之数据抽取流程 (r4笔记第72天)
- CSS Selectors Level 4新特性全面解析
- 巧用外部表避免大量的insert (r4笔记第71天)
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
- 16(01)总结List的子类,ArrayList,Vector,LinkedList
- 16(02)总结泛型
- 基于 React + Webpack 的音乐相册项目(上)
- 16(03)总结增强for循环,静态导入,可变参数
- 基于 React + Webpack 的音乐相册项目(下)
- 通过图表简化sql语句的表关联(r4笔记第70天)
- 通过编程控制CPU利用率(r4笔记第69天)
- Java基础(01)-15总结对象数组,集合Collection,集合List
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHPUnit + Laravel单元测试常用技能
- php接口隔离原则实例分析
- laravel实现按月或天或小时统计mysql数据的方法
- laravel model模型处理之修改查询或修改字段时的类型格式案例
- 对laravel的session获取与存取方法详解
- php 中self,this的区别和操作方法实例分析
- Laravel使用原生sql语句并调用的方法
- Yii框架自定义数据库操作组件示例
- laravel 使用事件系统统计浏览量的实现
- PHP之多条件混合筛选功能的实现方法
- PHP多进程简单实例小结
- 解决laravel5中auth用户登录其他页面获取不到登录信息的问题
- Yii框架学习笔记之应用组件操作示例
- laravel 之 Eloquent 模型修改器和序列化示例
- TP5框架请求响应参数实例分析