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);
推荐参考