GCD编程(封装GCD)
//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"
GCD编程(封装GCD)的更多相关文章
- Object-C定时器,封装GCD定时器的必要性!!! (一)
实际项目开发中经常会遇到延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. iOS中延迟操作有三种解决方案: 1.NSObject的方法:(对象方法) p ...
- GCD编程 之 略微提高篇
额外任务:学习YouXianMing封装好的GCD源码 1.GCD串行队列与并发队列 串行队列一次只执行一个线程,按照添加到队列的顺序依次执行 并发队列一次可以执行多个线程,线程的执行没有先后 ...
- Object-C定时器,封装GCD定时器的必要性!!! (二)
上一篇:Object-C定时器,封装GCD定时器的必要性!!! (一) 上一篇认识了Object-C中的几种定时器,这一篇将Dispatch定时器(GCD定时器)封装起来. p.p1 { margin ...
- 欧几里得算法:从证明等式gcd(m, n) = gcd(n, m mod n)对每一对正整数m, n都成立说开去
写诗或者写程序的时候,我们经常要跟欧几里得算法打交道.然而有没要考虑到为什么欧几里得算法是有效且高效的,一些偏激(好吧,请允许我用这个带有浓重个人情感色彩的词汇)的计算机科学家认为,除非程序的正确性在 ...
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 G ...
- python面向对象编程 -- 封装、继承
面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...
- UVA 1642 Magical GCD(经典gcd)
题意:给你n(n<=100000)个正整数,求一个连续子序列使序列的所有元素的最大公约数与个数乘积最大 题解:我们知道一个原理就是对于n+1个数与n个数的最大公约数要么相等,要么减小并且减小至少 ...
- Solve Equation gcd(x,y)=gcd(x+y,lcm(x,y)) gcd(x,y)=1 => gcd(x*y,x+y)=1
/** 题目:Solve Equation 链接:http://acm.hnust.edu.cn/JudgeOnline/problem.php?id=1643 //最终来源neu oj 2014新生 ...
- 学习:数学----gcd及扩展gcd
gcd及扩展gcd可以用来求两个数的最大公因数,扩展gcd甚至可以用来求一次不定方程ax+by=c的解 辗转相除法与gcd 假设有两个数a与b,现在要求a与b的最大公因数,我们可以设 a=b*q+ ...
随机推荐
- POST一个多部分编码(Multipart-Encoded)的文件
Requests使得上传多部分编码文件变得很简单: >>> url = 'http://httpbin.org/post' >>> files = {'file': ...
- Python 多级目录选择+一键正反排序
效果如图所示,可以根据条件来选择对象 cat pc.py #!/usr/bin/pythonfrom flask import Flask,render_template,request,redire ...
- Configure Always On Availability Group for SQL Server on Ubuntu
下面简单介绍一下如何在Ubuntu上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的填充方法. 目前在Linux上可以搭 ...
- Python算法-二叉树深度优先遍历
二叉树 组成: 1.根节点 BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空) TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度 ...
- Nmap手册
转自:http://drops.xmd5.com/static/drops/tips-4333.html 0x00:说明 只是一个快速查询手册,理论的东西都没有补充,欢迎大家积极在评论区补充自己常用的 ...
- 北京师范大学第十五届ACM决赛-重现赛
Another Server 时间限制:1秒 空间限制:262144K 题目描述 何老师某天在机房里搞事情的时候,发现机房里有n台服务器,从1到n标号,同时有2n-2条网线,从1到2n-2标号,其中第 ...
- IIS中如何应用程序启用https协议
首先已经安装完了SSL证书 1.找到需要添加的站点,右击 ---> 编辑绑定-->添加--->选择 ""https"-->选择"SSL ...
- MHA的介绍和测试(一)
MHA的介绍 MySQL的MHA:MySQL的高级可用性管理器和工具MHA的主要目标是在短(通常为10-30秒)的停机时间内自动化主故障转移和slave升级,不受复制一致性问题的困扰,不需要花费大量的 ...
- WebLoad XML-parser methods
WebLOAD provides an embedded, third-party XML parser object to improve the multi-platform support fo ...
- 【Luogu】P1155双栈排序(二分图)
题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] ...