iOS开发中使用GCD创建一个定时器

创建定时器的方法

1.使用NSTimer
2.使用GCD

使用NSTimer的问题

1.iOS10之前直接使用系统方法创建定时器会有循环引用的问题,导致NSTimer实例无法释放。
2.如果在操作UI的同时让NSTimer有效还需要考虑runLoop模式问题和线程问题。

使用GCD

不用考虑定时器不释放的问题,不用考虑runLoop,不用考虑多线程。

本人利用GCD创建的一个定时器类----LSTimer

创建代码:

/// 创建定时器
/// @param interval 定时器的时间间隔
/// @param waitTime 定时器持续时间  当小于等于0时定时器会一直持续下去
/// @param handler 每隔一段时间回调的方法
- (instancetype)initWithTimeInterval:(float)interval andWaitTime:(float)waitTime eventHandler:(void(^)(void))handler;


使用代码:

- (void)startAction{
// 开启定时器
[self.timer start];
}
- (LSTimer *)timer{
if (_timer == nil) {
    _timer = [[LSTimer alloc] initWithTimeInterval:1 andWaitTime:0 eventHandler:^{
        NSLog(@"1.");
    }];
}
return _timer;
}


以下是不影响使用的部分
内部实现代码:

  - (instancetype)initWithTimeInterval:(float)interval andWaitTime:(float)waitTime eventHandler:(nonnull void (^)(void))handler{
self = [super init];
if (self) {
    [self createTimerWithTimerInterval:interval andWaitTime:waitTime handler:handler];
}
return self;
}
  /// 创建定时器
- (void)createTimerWithTimerInterval:(float)interval andWaitTime:(float)waitTime handler:(void(^)(void))handler{

__block float waittingTime = waitTime;
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(timer, ^{
    if (waitTime <= 0) {    // 时间无限
        handler();
    }else{  // 时间有限
        if (waittingTime <= 0) {
            dispatch_source_cancel(timer);
            return ;
        }
        handler();
        waittingTime --;
    }
    
});
_timer = timer;
dispatch_resume(timer);

}
- (void)start{
NSLog(@"没有实际意义的start...");
}
/// 取消
-(void)stopTimer{
if(_timer){
    dispatch_source_cancel(_timer);
    _timer = nil;
}
}
- (void)dealloc{
NSLog(@"Timer销毁了...");
[self stopTimer];
}

demo地址:https://github.com/yangguanghei/GCD-LSTimer

你可能感兴趣的:(iOS开发中使用GCD创建一个定时器)