服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > 开发教程 > ios开发教程 >

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

时间:2016-11-05 09:46来源:未知 作者:最模板 点击:
最近项目上需要一个倒计时按钮的功能,于是就写了个倒计时的功能分类。先来看看效果吧。 倒计时.gif 再说如何实现这个功能如何实现之前,让我类吹吹他的有点吧 1、只要一句话就

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

倒计时.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
(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容