+-
GCD 定时器
首页 专栏 ios 文章详情
0

GCD 定时器

pzyno 发布于 3 月 30 日

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 就被释放了;且方便在其他地方操作,如暂停、取消、置空。
ios objective-c swift
阅读 141 发布于 3 月 30 日
举报
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
pzyno
1 声望
0 粉丝
关注作者
0 条评论
得票数 最新
提交评论
avatar
pzyno
1 声望
0 粉丝
关注作者
宣传栏
目录

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 就被释放了;且方便在其他地方操作,如暂停、取消、置空。