美文网首页selectoriOS DeveloperiOS
ios关于dispatch_source_t的使用技巧

ios关于dispatch_source_t的使用技巧

作者: 码渣 | 来源:发表于2017-02-16 11:35 被阅读117次

大家用的最多的是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
  • 把代码附上:欢迎大家下载学习。代码下载
  • 有什么问题欢迎大家提出与指正,一起交流和提高。

相关文章

网友评论

    本文标题:ios关于dispatch_source_t的使用技巧

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