iOS-GCD定时器的使用

2018-09-15  本文已影响1101人  我是何先生

在iOS开发的过程中定时器的使用比较频繁的,比较常见的场景是验证码的发送,或者是倒计时的展示.一般的需求我们直接使用NSTimer就能完成。但是NSTimer的坑也是比较多的,比如在UITableview的时候,需要把NSTimer添加到主循环,并且设置为NSRunLoopCommonModes。但是今天要记录的是:GCD定时器

先直接贴代码

File:GCDCountDown.h

@interface GCDCountDown()
@property(nonatomic,strong)dispatch_source_t timer;
+(instancetype)manager;
-(void)resume;
-(void)pause;
@end
*************************************************************************************

File:GCDCountDown.m

@implementation GCDCountDown
+(instancetype)manager{
    static GCDCountDown *countDown = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (countDown == nil) {
            countDown = [[GCDCountDown alloc]init];
        }
    });
    
    return countDown;
}

-(instancetype)init{
    self = [super init];
    if (self) {
        [self loadTimer];
    }
    return self;
}

//定时器设置
-(void)loadTimer{
    if (self.timer) {
        dispatch_cancel(self.timer);
        self.timer = nil;
    }
    
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    //创建一个定时器(dispatch_source_t本质上还是一个OC对象)
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    //设置定时器的各种属性
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0*NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(1.0*NSEC_PER_SEC);
    dispatch_source_set_timer(self.timer, start, interval, 0);
    
    
    //设置回调
    __weak typeof(self) weakSelf = self;
    dispatch_source_set_event_handler(self.timer, ^{
        //定时器需要执行的操作
        [weakSelf timerAction];
       
    });
    //启动定时器(默认是暂停)
    dispatch_resume(self.timer);
    
}

-(void)resume{
    //重新加载一次定时器
    [self loadTimer];
    
}
-(void)pause{
    if (self.timer) {
        dispatch_cancel(self.timer);
        self.timer = nil;
    }
    
}

@end

这是为了适配项目的需求封装的一个简单的定时器单例,精简了一些业务代理,不过主要的用法都贴出来了。GCD定时器的定义和使用就是这么简单,但是其中有几点是需要说明的:

@protocol OS_dispatch_source <OS_dispatch_object>
@end
typedef NSObject<OS_dispatch_source>* dispatch_source_t

也就是dispatch_source_t 就是一个NSObjective对象。对于想深入了解的同学自行百度(主要是本人实在没有那么多精力看源码)

上一篇下一篇

猜你喜欢

热点阅读