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
就被开释了;且不便在其余中央操作,如暂停、勾销、置空。