iOS日常经验总结

GCD梳理与总结(三)封装

2020-08-17  本文已影响0人  牧羊的诗人

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

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

先上Demo

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

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有帮助,请帮忙给作者点亮小星星作为鼓励。

上一篇下一篇

猜你喜欢

热点阅读