后面两节内容笔者次要对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有帮忙,请帮忙给作者点一下作为激励。