//用GCD做计时器 精确时间
NSTimeInterval period = 1.0; //设置时间间隔
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
//在这里执行事件
dispatch_sync(dispatch_get_main_queue(), ^{
});
});
暂停计时器
dispatch_resume(_timer);//恢复计时器,启动也是这个
dispatch_suspend(_timer);//暂时挂起,挂起的时候_timer不能被释放,否则会崩溃
dispatch_source_cancel(_timer);//停止计时器,停止以后就可以释放_timer了
说明一下:
1._timer在挂起以后,之前的计时仍然有效,比如你在计时到0.9秒的时候挂起,再次resume的时候就从0.9开始计算,过了0.1秒以后就会执行handler里的block。
2.dispatch_walltime 表示用精准计时,不跟随系统,不受系统的后台状态影响。
3.dispatch_source_set_event_handler是在子线程执行的,有UI刷新的代码需要调换到dispatch_get_main_queue()里执行。
网友评论