简易封装的 GCD 定时器

GCD定时器相比NSTimer可以忽略 Runloop带来的问题,同时也更加精确。

封装如下

#import <Foundation/Foundation.h>

@interface GCDTimer : NSObject

//新建 timer
+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
                        delay:(NSTimeInterval)delay
                        block:(void(^)(id timer))block;

//开启
+ (void)startWithTimer:(dispatch_source_t)timer;

//取消
+ (void)cancelWithTimer:(dispatch_source_t)timer;

//暂停
+ (void)pauseWithTimer:(dispatch_source_t)timer;
@end
#import "GCDTimer.h"

@interface GCDTimer()
//@property (nonatomic, strong) dispatch_source_t timer;

@end

@implementation GCDTimer

+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
                        delay:(NSTimeInterval)delay
                        block:(void (^)(id))block{
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(timeInterval * NSEC_PER_SEC);
    dispatch_source_set_timer(timer, start, interval, 0);
    dispatch_source_set_event_handler(timer, ^{
        if(block){
            block(timer);
        }
    });
    return timer;
}

+ (void)startWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_resume(timer);
    }
}

+ (void)pauseWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_suspend(timer);
    }
}

+ (void)cancelWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_cancel(timer);
    }
}

@end
使用
- (void)viewDidLoad {
    [super viewDidLoad];
    __block NSInteger i = 0;
    dispatch_source_t timer = [GCDTimer timerWithTimeInterval:1
                              delay:0
                              block:^(id timer) {
                                  i+=1;
                                  NSLog(@"** %ld **",i);
                                  if(i==20){
                                      [GCDTimer cancelWithTimer:timer];
                                  }
                              }];
    [GCDTimer startWithTimer:timer];
}

如有不正确的地方,还请各位多多指教。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,795评论 8 265
  • 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多...
    阳明AI阅读 4,734评论 0 17
  • iOS刨根问底-深入理解RunLoop 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时...
    reallychao阅读 4,200评论 0 6
  • 鉴于易生又被易太欺负,给前文补个续,易生的反击。 星期一 晚九点,“咚咚咚”门响了。 “干嘛?” “老婆,没有换洗...
    籽盐阅读 9,830评论 0 2
  • 外公,河流啊,轻松地流走哟… 外公哟,河流啊,轻松地流走哟…您悄悄地挣扎,不知痛苦是否过于巨大?在它来临的那一刻。...
    南溪向南北歌流海阅读 1,462评论 0 2