//GCDGroup 类

@interface GCDGroup : NSObject

@property (strong, nonatomic, readonly) dispatch_group_t dispatchGroup;

#pragma 初始化以及释放

- (instancetype)init;

#pragma 使用方法

- (void)enter;

- (void)leave;

- (void)wait;

- (BOOL)wait:(int64_t)delta;

@end

#import "GCDGroup.h"

@interface GCDGroup ()

@property (strong, nonatomic, readwrite) dispatch_group_t dispatchGroup;

@end

@implementation GCDGroup

- (instancetype)init {

self = [super init];

if (self) {

self.dispatchGroup = dispatch_group_create();

}

return self;

}

- (void)enter {

dispatch_group_enter(self.dispatchGroup);

}

- (void)leave {

dispatch_group_leave(self.dispatchGroup);

}

- (void)wait {

dispatch_group_wait(self.dispatchGroup, DISPATCH_TIME_FOREVER);

}

- (BOOL)wait:(int64_t)delta {

return dispatch_group_wait(self.dispatchGroup,
\

;

}

@end


//GCDQueue 类

@class GCDGroup;

@interface GCDQueue : NSObject

@property (strong, readonly, nonatomic) dispatch_queue_t dispatchQueue;

+ (GCDQueue *)mainQueue;

+ (GCDQueue *)globalQueue;

+ (GCDQueue *)highPriorityGlobalQueue;

+ (GCDQueue *)lowPriorityGlobalQueue;

+ (GCDQueue *)backgroundPriorityGlobalQueue;

#pragma 便利的构造方法

+ (void)executeInMainQueue:(dispatch_block_t)block;

+ (void)executeInGlobalQueue:(dispatch_block_t)block;

+ (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block;

+ (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block;

+ (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block;

+ (void)executeInMainQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

+ (void)executeInGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

+ (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

+ (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

+ (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

#pragma 初始化以及释放

- (instancetype)init;

- (instancetype)initSerial;

- (instancetype)initConcurrent;

#pragma 使用方法

- (void)execute:(dispatch_block_t)block;

- (void)execute:(dispatch_block_t)block afterDelay:(int64_t)delta;

- (void)waitExecute:(dispatch_block_t)block;

- (void)barrierExecute:(dispatch_block_t)block;

- (void)waitBarrierExecute:(dispatch_block_t)block;

- (void)suspend;

- (void)resume;

#pragma 与GCDGroup相关

- (void)execute:(dispatch_block_t)block inGroup:(GCDGroup *)group;

- (void)notify:(dispatch_block_t)block inGroup:(GCDGroup *)group;

@end

#import "GCDQueue.h"

#import "GCDGroup.h"

static GCDQueue *mainQueue;

static GCDQueue *globalQueue;

static GCDQueue *highPriorityGlobalQueue;

static GCDQueue *lowPriorityGlobalQueue;

static GCDQueue *backgroundPriorityGlobalQueue;

@interface GCDQueue ()

@property (strong, readwrite, nonatomic) dispatch_queue_t dispatchQueue;

@end

@implementation GCDQueue

+ (GCDQueue *)mainQueue {

return mainQueue;

}

+ (GCDQueue *)globalQueue {

return globalQueue;

}

+ (GCDQueue *)highPriorityGlobalQueue {

return highPriorityGlobalQueue;

}

+ (GCDQueue *)lowPriorityGlobalQueue {

return lowPriorityGlobalQueue;

}

+ (GCDQueue *)backgroundPriorityGlobalQueue {

return backgroundPriorityGlobalQueue;

}

+ (void)initialize {

/**

Initializes the class before it receives its first message.

1. The runtime sends the initialize message to classes in a

thread-safe manner.

2. initialize is invoked only once per class. If you want to

perform independent initialization for the class and for

categories of the class, you should implement load methods.

*/

if (self == [GCDQueue self]) 
{

mainQueue = [GCDQueue new];

mainQueue.dispatchQueue = \

dispatch_get_main_queue();

globalQueue = [GCDQueue new];

globalQueue.dispatchQueue = \

);

highPriorityGlobalQueue = [GCDQueue new];

highPriorityGlobalQueue.dispatchQueue = \

);

lowPriorityGlobalQueue = [GCDQueue new];

lowPriorityGlobalQueue.dispatchQueue = \

);

backgroundPriorityGlobalQueue = [GCDQueue new];

backgroundPriorityGlobalQueue.dispatchQueue = \

);

}

}

- (instancetype)init {

return [self initSerial];

}

- (instancetype)initSerial {

self = [super init];

if (self)

{

self.dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);

}

return self;

}

- (instancetype)initConcurrent {

self = [super init];

if (self)

{

self.dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT);

}

return self;

}

- (void)execute:(dispatch_block_t)block {

dispatch_async(self.dispatchQueue, block);

}

- (void)execute:(dispatch_block_t)block afterDelay:(int64_t)delta
{

// NSEC_PER_SEC

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delta), self.dispatchQueue,
block);

}

- (void)waitExecute:(dispatch_block_t)block {

/*

As an optimization, this function invokes the block on

the current thread when possible.

作为一个建议,这种方法尽量在当前线程池中调用.

*/

dispatch_sync(self.dispatchQueue, block);

}

- (void)barrierExecute:(dispatch_block_t)block {

/*

The queue you specify should be a concurrent queue that you

create yourself using the dispatch_queue_create function.

If the queue you pass to this function is a serial queue or

one of the global concurrent queues, this function behaves

like the dispatch_async function.

使用的线程池应该是你自己创建的并发线程池.假设你传进来的參数为串行线程池

或者是系统的并发线程池中的某一个,这种方法就会被当做一个普通的async操作

*/

dispatch_barrier_async(self.dispatchQueue,
block);

}

- (void)waitBarrierExecute:(dispatch_block_t)block {

/*

The queue you specify should be a concurrent queue that you

create yourself using the dispatch_queue_create function.

If the queue you pass to this function is a serial queue or

one of the global concurrent queues, this function behaves

like the dispatch_sync function.

使用的线程池应该是你自己创建的并发线程池.假设你传进来的參数为串行线程池

或者是系统的并发线程池中的某一个,这种方法就会被当做一个普通的sync操作

As an optimization, this function invokes the barrier block

on the current thread when possible.

作为一个建议,这种方法尽量在当前线程池中调用.

*/

dispatch_barrier_sync(self.dispatchQueue,
block);

}

- (void)suspend {

dispatch_suspend(self.dispatchQueue);

}

- (void)resume {

dispatch_resume(self.dispatchQueue);

}

- (void)execute:(dispatch_block_t)block inGroup:(GCDGroup *)group
{

dispatch_group_async(group.dispatchGroup, self.dispatchQueue,
block);

}

- (void)notify:(dispatch_block_t)block inGroup:(GCDGroup *)group
{

dispatch_group_notify(group.dispatchGroup, self.dispatchQueue,
block);

}

#pragma mark - 便利的构造方法

+ (void)executeInMainQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec
{

[[GCDQueue mainQueue] execute:^{

block();

} afterDelay:NSEC_PER_SEC * sec];

}

+ (void)executeInGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec
{

[[GCDQueue globalQueue] execute:^{

block();

} afterDelay:NSEC_PER_SEC * sec];

}

+ (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec
{

[[GCDQueue highPriorityGlobalQueue] execute:^{

block();

} afterDelay:NSEC_PER_SEC * sec];

}

+ (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec
{

[[GCDQueue lowPriorityGlobalQueue] execute:^{

block();

} afterDelay:NSEC_PER_SEC * sec];

}

+ (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec
{

[[GCDQueue backgroundPriorityGlobalQueue] execute:^{

block();

} afterDelay:NSEC_PER_SEC * sec];

}

+ (void)executeInMainQueue:(dispatch_block_t)block {

[[GCDQueue mainQueue] execute:^{

block();

}];

}

+ (void)executeInGlobalQueue:(dispatch_block_t)block {

[[GCDQueue globalQueue] execute:^{

block();

}];

}

+ (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block {

[[GCDQueue highPriorityGlobalQueue] execute:^{

block();

}];

}

+ (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block {

[[GCDQueue lowPriorityGlobalQueue] execute:^{

block();

}];

}

+ (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block {

[[GCDQueue backgroundPriorityGlobalQueue] execute:^{

block();

}];

}


//3 GCDSemaphore 类

@interface GCDSemaphore : NSObject

@property (strong, readonly, nonatomic) dispatch_semaphore_t dispatchSemaphore;

#pragma 初始化以及释放

- (instancetype)init;

- (instancetype)initWithValue:(long)value;

#pragma 使用方法

- (BOOL)signal;

- (void)wait;

- (BOOL)wait:(int64_t)delta;

@end


#import "GCDSemaphore.h"

@interface GCDSemaphore ()

@property (strong, readwrite, nonatomic) dispatch_semaphore_t dispatchSemaphore;

@end

@implementation GCDSemaphore

- (instancetype)init {

self = [super init];

if (self) {

);

}

return self;

}

- (instancetype)initWithValue:(long)value {

self = [super init];

if (self) {

self.dispatchSemaphore = dispatch_semaphore_create(value);

}

return self;

}

- (BOOL)signal {

return dispatch_semaphore_signal(self.dispatchSemaphore)
!= ;

}

- (void)wait {

dispatch_semaphore_wait(self.dispatchSemaphore, DISPATCH_TIME_FOREVER);

}

- (BOOL)wait:(int64_t)delta {

return dispatch_semaphore_wait(self.dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW,
delta)) == ;

}


//4 GCDTimer

class GCDQueue;

@interface GCDTimer : NSObject

@property (strong, readonly, nonatomic) dispatch_source_t dispatchSource;

#pragma 初始化以及释放

- (instancetype)init;

- (instancetype)initInQueue:(GCDQueue *)queue;

#pragma 使用方法

- (void)event:(dispatch_block_t)block timeInterval:(uint64_t)interval;

- (void)start;

- (void)destroy;

@end


#import "GCDTimer.h"

#import "GCDQueue.h"

@interface GCDTimer ()

@property (strong, readwrite, nonatomic) dispatch_source_t dispatchSource;

@end

@implementation GCDTimer

- (instancetype)init

{

self = [super init];

if (self) {

self.dispatchSource = \

));

}

return self;

}

- (instancetype)initInQueue:(GCDQueue *)queue {

self = [super init];

if (self) {

self.dispatchSource = \

,
queue.dispatchQueue);

}

return self;

}

- (void)event:(dispatch_block_t)block timeInterval:(uint64_t)interval
{

dispatch_source_set_timer(self.dispatchSource,

),

interval,

);

dispatch_source_set_event_handler(self.dispatchSource,
^{

block();

});

}

- (void)start {

dispatch_resume(self.dispatchSource);

}

- (void)destroy {

dispatch_source_cancel(self.dispatchSource);

}


//GCD.h

#import "GCDQueue.h"

#import "GCDGroup.h"

#import "GCDSemaphore.h"

#import "GCDTimer.h"

最新文章

  1. Android 手机卫士--阶段小结1
  2. 图片加载完后执行js
  3. PHP开发环境配置
  4. 一个关于el中获取对象属性的错误
  5. python操作mongodb之五大量写操作
  6. HDU 1564 Play a game (找规律博弈)
  7. VMWare-NAT模式实现局域网其他主机对虚拟机访问
  8. java 垃圾回收机制 引用类型
  9. [置顶] ios 时间定时器 NSTimer应用demo
  10. Beginning Python From Novice to Professional (7) - 类别
  11. pig、hive以及hbase的作用
  12. uva103 动态规划
  13. [Swift]LeetCode910. 最小差值 II | Smallest Range II
  14. printf()、sprintf()、vprintf()、vsprintf()(转)
  15. CentOS 7静默安装Oracle 11g R2数据库软件
  16. 概率dp总结 正在更新
  17. 通过socket实现http通讯代码理解
  18. SwingBench 字符模式压测最佳实践
  19. 【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  20. 文件的存储GridFS

热门文章

  1. ERROR! The server quit without updating PID file (/usr/local/var/mysql/bogon.pid).
  2. LCD驱动分析(一)字符设备驱动框架分析
  3. 文本搜索grep知识点总结
  4. 00030_ArrayList集合
  5. 利用visual studio 搜索替换功能清除项目中javascript文件的debugger;
  6. WEB框架——WEB框架本质
  7. angular 组件之间传值
  8. pycharm下多个工程项目并存显示
  9. SG博弈函数模板
  10. BZOJ 3168 [Heoi2013]钙铁锌硒维生素 ——矩阵乘法 矩阵求逆