最近项目上需要一个倒计时按钮的功能,于是就写了个倒计时的功能分类。先来看看效果吧。 倒计时.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(责任编辑:好模板) |