【iOS】使用GCD创建定时器

GCD中的定时器是靠 Dispatch Source 来实现的

优点

  • 时间准确
  • 可以使用子线程,解决定时间跑在主线程上卡UI问题

执行一次

#define DelayInSeconds 2.0f

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, DelayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    //执行事件
});

重复执行

#define BaseTimerInterval 25.0f

//需要将dispatch_source_t myTimer设置为成员变量,不然会立即释放
@property (nonatomic, strong) dispatch_source_t myTimer;

//间隔是25秒
uint64_t interval = BaseTimerInterval * NSEC_PER_SEC;
        
//创建一个专门执行timer回调的GCD队列
dispatch_queue_t queue = dispatch_queue_create("<队列名称>", 0);
        
//创建Timer
self.myTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        
//使用dispatch_source_set_timer函数设置timer参数
/**
  * dispatch_source_set_timer(dispatch_source_t source, 
                              dispatch_time_t start,
                              uint64_t interval, 
                              uint64_t leeway);
  * start 计时器起始时间,可以通过dispatch_time创建,如果使用DISPATCH_TIME_NOW,则创建后立即执行
  * interval 计时器间隔时间,可以通过timeInterval * NSEC_PER_SEC来设置,timeInterval为对应的秒数
  * leeway 这个参数告诉系统我们需要计时器触发的精准程度(所以你可以传入60,告诉系统60秒的误差是可接受的)
  */



dispatch_source_set_timer(self.myTimer, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);
        
//设置回调
dispatch_source_set_event_handler(self.myTimer, ^() {
    //可以在这里处理一些事情
});
        
//dispatch_source默认是Suspended(暂停)状态,通过dispatch_resume函数开始它
dispatch_resume(self.myTimer);
//销毁定时器
dispatch_source_cancel(self.myTimer);

推荐参考

  • NSTimer使用小记
  • IOS中延时执行的几种方式的比较和汇总
  • iOS中几种定时器

你可能感兴趣的:(【iOS】使用GCD创建定时器)