通过梳理,我们可以发现,其实GCD的概念并不是很复杂,只是初学者往往会被它C语言的大串API以及网上各种很绕的概念给唬住了。剖开表象,看本质。GCD(Grand Central Dispatch)不过是多线程编程的一套API,一个多线程工具。工具本身不应该有难度。
GCD的这套C语言API,相对来说使用起来比较繁琐,比较长,即使在有代码提示的情况,编码感受也较为不顺畅,在项目中不管是和OC还是swift风格上都有那么一点格格不入。所以笔者决定对一些常用的API进行封装,目的是在基本保持原有写法结构的基础上,尽量使其更加面向对象,更加简单易用。当然,笔者所封装的只是GCD的冰山一角,目的是应付95%的项目场景,所以还是建议读者们能够正本清源,在学习好GCD的基础上,批判性的选择使用,切不可依赖。下面我来谈谈我的封装思路,也期待广大网友能够在这套基础上继续舔砖加瓦。
前面两章我们谈到过三个概念:任务,队列,执行队列的方式。
`#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`复制代码
`///同步执行
+ (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有帮助,请帮忙给作者点一下作为鼓励。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。