大家用的最多的是NSTimer定时器,也是最熟练的。但论定时器的精度来说,dispatch_source_t要比NStimer更精度,系统自动触发,系统级别的源。所以让大家能认识和使用dispatch_source_t,我封装了一个类,供参考和学习
1.先看如何调用:创建对象 然后直接调用方法
GBTimer *timer = [GBTimer sharedTimer];
[timer resumeTimerWithTimeDuration:5 timeInterval:1 handle:^(uint64_t currentTime, GBTimer *timer) {
// do some thing
NSLog(@"%llu",currentTime);
if (currentTime == 2) {
[timer cancelTimer];
}
}];
2.内部如何实现:一目了然
GBTimer .h文件
#import
@class GBTimer;
@interface GBTimer : NSObject
+ (instancetype)sharedTimer;
/**
开启定时器
@param duration 定时时长
@param interval 定时间隔
@param handle 回调
*/
- (void)resumeTimerWithTimeDuration:(uint64_t)duration timeInterval:(uint64_t)interval handle:(void (^)(uint64_t currentTime, GBTimer *timer))handle;
/**
取消定时器
*/
- (void)cancelTimer;
@end
GBTimer.m
#import "GBTimer.h"
@interface GBTimer ()
@property (nonatomic, strong) dispatch_source_t timer;
@end
@implementation GBTimer
static GBTimer *instance;
+ (instancetype)sharedTimer {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (void)resumeTimerWithTimeDuration:(uint64_t)duration timeInterval:(uint64_t)interval handle:(void (^)(uint64_t currentTime, GBTimer *timer))handle {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 创建定时器
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 设置定时时间
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, duration*NSEC_PER_SEC);
// 配置定时器
dispatch_source_set_timer(_timer, start, interval*NSEC_PER_SEC, 0);
__block uint64_t timeInterval = duration;
// 回调
dispatch_source_set_event_handler(_timer, ^{
timeInterval--;
dispatch_async(dispatch_get_main_queue(), ^{
handle(timeInterval, instance);
});
if (timeInterval <= 0) {
[self cancelTimer];
}
});
// 开启定时器
dispatch_resume(_timer);
}
- (void)cancelTimer {
if (_timer) {
dispatch_source_cancel(_timer);
_timer = nil;
}
}
@end
- 把代码附上:欢迎大家下载学习。代码下载
- 有什么问题欢迎大家提出与指正,一起交流和提高。
网友评论