美文网首页IOS
GCD倒计时器速成

GCD倒计时器速成

作者: DEMOKING | 来源:发表于2021-04-26 11:59 被阅读0次

简单介绍

1、单例类管理GCD计时器;
2、类方法调用计时器API,方便快捷;
3、提供三组API,快速实现计时、倒计时、取消计时;
4、目前仅提供同时存在1组计时器;
5、计时结束后,自动取消,也可手动取消计时器;

注意事项

1、在页面加载和退出时,注意定时器的销毁。
2、及时调用销毁方法,避免释放不掉的问题。
例如:

+ (void)cancelSingleTimer;

.h

构建回调block

/*
每秒频单频计时器回调
current 每秒回调一次 回调当前的时间
end 当为TRUE时 定时器结束
*/

typedef void (^DKTimerSingleTimerBlock)(NSInteger current, BOOL end);

/*
DKTimer
*/

@interface DKTimer : NSObject

/*
倒计时
time:从xx秒开始倒计时
block: 回调
*/

+ (void)countdown:(NSInteger)time block:(DKTimerSingleTimerBlock)block;

/*
计时
max:计时xx时间
block: 回调
*/

+ (void)singleTimer:(NSInteger)max block:(DKTimerSingleTimerBlock)block;

/*
取消计时
*/

+ (void)cancelSingleTimer;

.m

声明属性

/*
每秒频单频计时器;
每次调用前,会销毁之前的定时器;
支持计时和倒计时。倒计时到0时,停止计时;
回调的block均为主线程;
*/

@property (strong, nonatomic) dispatch_source_t singleTimer;
@property (assign, nonatomic) NSInteger current;
@property (assign, nonatomic) NSInteger max;
@property (assign, nonatomic) BOOL sequence;
@property (copy, nonatomic) DKTimerSingleTimerBlock singleTimerBlock;

构建单例类

/*
单例类的创建
使用单例类创建定时器,在一定的环境下,可以高效的控制定时器。
*/

+ (DKTimer *)timer {
    static dispatch_once_t onceToken;
    static DKTimer *timer = nil;
    dispatch_once(&onceToken, ^{
        timer = [[DKTimer alloc] init];
    });
    return timer;
}

公有API

/*
倒计时 最小从1开始倒计时
time:从xx秒开始倒计时
block: 回调
*/

+ (void)countdown:(NSInteger)time block:(DKTimerSingleTimerBlock)block {
    if (time <= 0) {
        return;
    }
    [DKTimer timer].singleTimerBlock = block;
    [DKTimer timer].sequence = NO;
    [DKTimer timer].current = time;
    [[DKTimer timer] startSingleTime];
}

/*
计时
max:计时xx时间
block: 回调
*/

+ (void)singleTimer:(NSInteger)max block:(DKTimerSingleTimerBlock)block {
    [DKTimer timer].singleTimerBlock = block;
    [DKTimer timer].sequence = YES;
    [DKTimer timer].max = max;
    [DKTimer timer].current = 0;
    [[DKTimer timer] startSingleTime];
}

/*
取消计时
*/

+ (void)cancelSingleTimer {
    [[DKTimer timer] stopSingleTimer];
}

私有API

/*
计时器的回调方法 主线程
*/

- (void)singleTimerMethod {
    if ([DKTimer timer].sequence) {
        // 计时
        [DKTimer timer].current = [DKTimer timer].current + 1;
        BOOL end;
        if ([DKTimer timer].current > [DKTimer timer].max) {
            // 结束
            end = YES;
            [self stopSingleTimer];
        }else {
            // 继续
            end = NO;
        }
        if ([DKTimer timer].singleTimerBlock) {
            [DKTimer timer].singleTimerBlock([DKTimer timer].current, end);
        }
    }else {
        // 倒计时
        [DKTimer timer].current = [DKTimer timer].current - 1;
        BOOL end;
        if ([DKTimer timer].current < 0) {
            // 结束
            end = YES;
            [self stopSingleTimer];
        }else {
            // 继续
            end = NO;
        }
        if ([DKTimer timer].singleTimerBlock) {
            [DKTimer timer].singleTimerBlock([DKTimer timer].current, end);
        }
    }
}

计时器创建 开始 销毁

- (void)stopSingleTimer {
    if (_singleTimer) {
        dispatch_cancel(_singleTimer);
        _singleTimer = nil;
    }
}
- (void)startSingleTime {
    [self stopSingleTimer];
    __weak DKTimer *weakself = self;
    NSInteger timeSpace = 1;
    dispatch_queue_t queue = dispatch_get_main_queue();
    self.singleTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(timeSpace * NSEC_PER_SEC);
    dispatch_source_set_timer(self.singleTimer, start, interval, 0);
    dispatch_source_set_event_handler(self.singleTimer, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakself singleTimerMethod];
        });
    });
    dispatch_resume(self.singleTimer);
}

IMG_2847.jpg

相关文章

  • GCD倒计时器速成

    简单介绍 1、单例类管理GCD计时器;2、类方法调用计时器API,方便快捷;3、提供三组API,快速实现计时、倒计...

  • iOS - 计时器及冲突问题(NSTimer,dispatch_

    说到计时器大家也都很清楚NSTimer计时器,GCD 计时器。下面我们来说一下这两个计时器,以及计时器在遇到UIS...

  • GCD计时器

    计时器的方法是用: 计时器方法有多种,其中一个可以使用GCD,也可以用NSTimer,现在介绍GCD的方法(笔者认...

  • 面试问题总结

    Runtime理解。 Runloop理解,结合计时器。 GCD常用的方法。 GCD的原理。 KVO和KVC的实现原...

  • iOS - GCD 实现定时器、倒计时

    标签(空格分隔): 计时器 GCD timer 倒计时 GCD 定时器 NSTimer 的定时器是在 RunLoo...

  • NSTimer CADisplayLink GCD计时器的深入探

    关于NSTimer CADisplayLink GCD计时器的杂谈 ** NSTimer ** iOS中最常用的定...

  • GCD计时器

    大家在开发的过程中,经常会用到定时器,通常的做法可能就是NSTimer,了解过GCD的同学可能会接触到dispat...

  • YYTimer源码阅读

    YYTimer是一个基于GCD的线程安全的计时器,它的API和NSTimer类似。有以下几种不同点: 基于GCD,...

  • 使用GCD实现计时器

    使用GCD实现计时器 转载自:https://www.cnblogs.com/lovemargin/p/14576...

  • iOS 单例计时器(页面切换仍然计时)

    iOS 单例计时器(页面切换仍然计时)NSTimer 定时器(2)GCD 多线程(4) //–––––––––––...

网友评论

    本文标题:GCD倒计时器速成

    本文链接:https://www.haomeiwen.com/subject/gqzsrltx.html