OC - 使用GCD实现倒计时功能
2016-06-01 12:01
441 查看
自己写了个NSObject的扩展,使用GCD方式实现倒计时功能,不多说了,直接上代码
.h文件
/**
* 处理倒计时停止的回调
*/
typedef void(^HandleStopCountdownBlock)(NSString *stopTime);
/**
* 处理倒计时改变的回调
*/
typedef void(^HandleChangeCountdownBlock)(NSString *changeTime);
@interface NSObject (GCD)
/**
* GCD定时器(倒计时)
*
* param Timeout 倒计时开始时间
* param handleChangeCountdownBlock 倒计时时间改变回调
* param handleStopCountdownBlock 倒计时时间停止回调
*/
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock;
.m文件
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock
{
__blockNSInteger timeout = Timeout;//倒计时时间
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,
queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL,0),1.0
* NSEC_PER_SEC,0);//每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout <=0){//倒计时结束,关闭
//取消
dispatch_source_cancel(_timer);
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示根据自己需求设置
if (handleStopCountdownBlock)
{
NSString *timeoutStr = [NSStringstringWithFormat:@"%ld",timeout];
handleStopCountdownBlock(timeoutStr);
}
});
}else{
NSInteger minutes;
NSInteger seconds;
NSString *strTime;
if (timeout >60)
{
minutes = timeout / 60;
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld分%.2ld秒后重新获取验证码",(long)minutes,
(long)seconds];
}
else
{
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld秒后重新获取验证码",(long)seconds];
}
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示根据自己需求设置
if (handleChangeCountdownBlock)
{
handleChangeCountdownBlock(strTime);
}
});
timeout--;
}
});
//启动
dispatch_resume(_timer);
return _timer;
}
就是这样,非常实用,另外附上朋友写的使用NSTimer实现倒计时的博客地址链接:http://blog.csdn.net/siwen1990/article/details/51548299
.h文件
/**
* 处理倒计时停止的回调
*/
typedef void(^HandleStopCountdownBlock)(NSString *stopTime);
/**
* 处理倒计时改变的回调
*/
typedef void(^HandleChangeCountdownBlock)(NSString *changeTime);
@interface NSObject (GCD)
/**
* GCD定时器(倒计时)
*
* param Timeout 倒计时开始时间
* param handleChangeCountdownBlock 倒计时时间改变回调
* param handleStopCountdownBlock 倒计时时间停止回调
*/
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock;
.m文件
+ (dispatch_source_t)queryGCDWithTimeout:(NSInteger)Timeout
handleChangeCountdownBlock:(HandleChangeCountdownBlock)handleChangeCountdownBlock
handleStopCountdownBlock:(HandleStopCountdownBlock)handleStopCountdownBlock
{
__blockNSInteger timeout = Timeout;//倒计时时间
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,
queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL,0),1.0
* NSEC_PER_SEC,0);//每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout <=0){//倒计时结束,关闭
//取消
dispatch_source_cancel(_timer);
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示根据自己需求设置
if (handleStopCountdownBlock)
{
NSString *timeoutStr = [NSStringstringWithFormat:@"%ld",timeout];
handleStopCountdownBlock(timeoutStr);
}
});
}else{
NSInteger minutes;
NSInteger seconds;
NSString *strTime;
if (timeout >60)
{
minutes = timeout / 60;
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld分%.2ld秒后重新获取验证码",(long)minutes,
(long)seconds];
}
else
{
seconds = timeout % 60;
strTime = [NSStringstringWithFormat:@"%ld秒后重新获取验证码",(long)seconds];
}
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示根据自己需求设置
if (handleChangeCountdownBlock)
{
handleChangeCountdownBlock(strTime);
}
});
timeout--;
}
});
//启动
dispatch_resume(_timer);
return _timer;
}
就是这样,非常实用,另外附上朋友写的使用NSTimer实现倒计时的博客地址链接:http://blog.csdn.net/siwen1990/article/details/51548299
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Delphi实现毫秒级别的倒计时实例代码
- Windows Powershell扩展类型系统
- javascript 宝宝出生倒计时实现代码
- C#、ASP.NET通用扩展工具类之LogicSugar
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- 基于MySql的扩展功能生成全局ID