GCD 定时器
Posted pzyno
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCD 定时器相关的知识,希望对你有一定的参考价值。
Swift
var timer : DispatchSourceTimer?
func startTimer() {
var timeCount = 10
// 在global线程里创建一个时间源
if timer == nil {
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
}
// 设定这个时间源是每秒循环一次,立即开始
timer?.schedule(deadline: .now(), repeating: .seconds(1))
// 设定时间源的触发事件
timer?.setEventHandler(handler: {
//此时处于 global 线程中
print("定时器:",timeCount)
// 每秒计时一次
timeCount = timeCount - 1
// 时间到了取消时间源
if timeCount <= 0 {
self.stopTimer()
DispatchQueue.main.async {
//UI操作放在主线程
}
}
})
// 启动时间源
timer?.resume()
}
//停止定时器
func stopTimer() {
print("定时器结束")
timer?.cancel()
timer = nil
}
Objective-C
@interface ViewController ()
{
dispatch_source_t _timer;
}
@end
-(void)startTimer{
__block NSInteger timeCount = 10;
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, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"定时器:%li",(long)timeCount);
timeCount --;
if (timeCount <= 0) {
[self stopTimer];
dispatch_async(dispatch_get_main_queue(), ^{
});
}
});
dispatch_resume(timer);
_timer = timer;
}
-(void)stopTimer{
dispatch_source_cancel(_timer);
_timer = nil;
}
有两点需要注意:
- 照此方法停止定时器,可以复用,使用
suspend
停止定时器无法复用 timer
要设置为全局对象。否则代码执行完后timer
就被释放了;且方便在其他地方操作,如暂停、取消、置空。
以上是关于GCD 定时器的主要内容,如果未能解决你的问题,请参考以下文章
GCD dispatch_source基本使用,创建GCD定时器与NSTimer的区别