ios - Swift Dispatch Source Timer 没有按计划触发

标签 ios swift timer

我有一个定时器声明如下:

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 , 你也可以尝试缩短 intervaldelay 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/

相关文章:

iphone - 使用 uiscrollview 缩放

ios - 我如何告诉我的应用程序我的 Pod 头文件在哪里?

ios - NSURLSession dataTaskWithRequest 只在第一次工作

ios - 从 Parse 服务器获取数据到 xcode

java - Java 和 Web 套接字中的 TimerTask

ios - 如何在 swift 3.0 中使用 UnSafeRawPointer

objective-c - 数组、内存管理

ios - URLSession 发送 GET 请求而不是 POST

java - 如何以及在何处使用 javax.swing 计时器

java - 进化模拟 - 用于计时器事件处理的持久线程