我有一个定时器声明如下:
var timer: DispatchSourceTimer?
override func viewDidLoad() {
super.viewDidLoad()
...
timer = DispatchSource.makeTimerSource()
timer!.scheduleRepeating(deadline: .now() + .seconds(60), interval: .seconds(3600), leeway: .seconds(1))
timer!.setEventHandler { [weak self] in
self?.saveData()
}
timer!.resume()
print("TIMER HAS STARTED")
}
此代码在我的 viewDidLoad
方法中执行,并在我包含的 1 分钟延迟后第一次正确触发。然后它应该每小时触发一次。我在模拟器中运行我的应用程序,使其始终处于开启状态并保持专注。事实上它仍在运行。
第一次保存数据时,我记录的时间是上午 11:45。直到下午 1:00 才再次保存,然后是 2:08。我错过了什么?
编辑:测试此计时器时,我能够每分钟获取一次数据,但对于实际应用程序,我需要它每小时执行一次。
最佳答案
在我的例子中,DispatchSourceTimer
当我在 viewDidLoad
中创建它的实例时不会触发事件,不太确定为什么,尝试了多次。
所以只要确保你有你的 DispatchSourceTimer
作为property
, 你也可以尝试缩短 interval
和 delay
DispatchSourceTimer
的参数为测试而安排的时间表,如下所示:
// MARK: - Properties
var timer: DispatchSourceTimer!
// MARK: - Functions
// MARK: Overrdes
override func viewDidLoad() {
super.viewDidLoad()
timer = DispatchSource.makeTimerSource()
timer.schedule(deadline: .now() + .seconds(1), repeating: .seconds(5), leeway: .seconds(1))
timer.setEventHandler(handler: { [weak self] in
guard let strongSelf = self else { return }
strongSelf.saveData()
})
timer.resume()
}
func saveData() {
print("❇️Invoked...")
}
关于ios - Swift Dispatch Source Timer 没有按计划触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610755/