iOS 一句代码搞定倒计时按钮

2017-01-14 10:04:59来源:http://www.jianshu.com/p/ae99011e9e5d作者:Adorkable人点击

最近项目上需要一个倒计时按钮的功能,于是就写了个倒计时的功能分类。先来看看效果吧。



倒计时.gif


在说如何实现这个功能如何实现之前,让我类吹吹他的优点吧
1、只要一句话就可以实现倒计时啦
2、他不会产生产生循环引用
在写这个功能的时候,就想写一个工具类,下次使用的时候直接拖过来。而且,这个倒计时不能局限于 UIButton,而应该在每个类都能被使用,于是就给NSObject写个分类,因为OC中所有的类都是继承于NSObject的嘛,它有了继承于他的儿子们 也都有了。


上菜(代码)了!

首先是分类的.h文件了


#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
typedef void(^TYNCountDownBlock)(NSUInteger timer);
typedef void(^TYNFinishBlock)();
@interface NSObject (CountDown)
/**
按钮倒计时
@param time 倒计时总时间
@param countDownBlock 每秒倒计时会执行的block
@param finishBlock 倒计时完成会执行的block
*/
- (void)countDownTime:(NSUInteger)time countDownBlock:(TYNCountDownBlock)countDownBlock outTimeBlock:(TYNFinishBlock)finishBlock;
@end

然后就是我们的实现类了


#import "NSObject+CountDown.h"
#import <objc/runtime.h>
@interface NSObject ()
/** 定时器 */
@property (nonatomic,strong) dispatch_source_t timer;
@end
@implementation NSObject (CountDown)
- (void)countDownTime:(NSUInteger)time countDownBlock:(TYNCountDownBlock)countDownBlock outTimeBlock:(TYNFinishBlock)finishBlock{
__block NSUInteger second = time;
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1.0f * NSEC_PER_SEC, 1.0f * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
if (countDownBlock != nil) {
countDownBlock(second);
}
});
if ((second--) == 0) {
dispatch_cancel(self.timer);
self.timer = nil;
dispatch_sync(dispatch_get_main_queue(), ^{
if (finishBlock != nil) {
finishBlock();
}
});
}
});
dispatch_resume(self.timer);
}
- (void)setTimer:(dispatch_source_t)timer{
objc_setAssociatedObject(self, @selector(timer), timer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (dispatch_source_t)timer{
return objc_getAssociatedObject(self, @selector(timer));
}
@end

戳我看Demo
感觉不错的给个星星哦




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台