共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。
后面两节内容笔者次要对 GCD 的一些基本概念和罕用 API 做了一个简略的梳理和演绎,对照笔者提供的 Demo 案例,置信读者对 GCD 可能有个入门。通过梳理,咱们能够发现,其实 GCD 的概念并不是很简单,只是初学者往往会被它 C 语言的大串 API 以及网上各种很绕的概念给唬住了。剖开表象,看实质。GCD(Grand Central Dispatch)不过是多线程编程的一套 API,一个多线程工具。工具自身不应该有难度。
iOS 开发交换技术群:563513413,不论你是大牛还是小白都欢送入驻,分享 BAT, 阿里面试题、面试教训,探讨技术,大家一起交流学习成长!
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 有帮忙,请帮忙给作者点一下作为激励。