【发布时间】:2019-08-03 12:27:01
【问题描述】:
我很难理解DispatchSourceTimer、Timer 和 asyncAfter 之间的主要区别(在我的情况下,用于安排需要每 X 秒运行一次的任务,尽管了解计时器的区别可以对有用)(或者除了列出的计时器之外,Swift 中还有另一种(更有效的)调度机制吗?)。
A Timer 需要在它启动的当前队列上有一个活动的运行循环。 DispatchSourceTimer 不需要那个。 Timer 使 CPU 不会进入空闲状态。这是否也适用于DispatchSourceTimer/asyncAfter?
在什么情况下Timer 比DispatchSourceTimer/asyncAfter 更受欢迎?当然还有它们之间的区别?
我想在我的应用程序中每 15 秒在一个私有队列上安排一次工作。这意味着我必须使用DispatchSourceTimer,因为我在一个不是主线程的队列上(或者在队列中添加一个运行循环并使用Timer)。但是,我什至一开始就没有看到使用Timer 的任何好处。也许还有另一个操作,我可以在私有队列上每隔 X 秒使用一次调度工作,它比 DispatchSourceTimer 更有效,但我没有找到更好的解决方案。
DispatchSourceTimer 是否比 Timer 更有效?还是我应该使用asyncAfter 进行自调用方法?
这是创建计时器的代码。
asyncAfter
DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(2)) {
// Code
}
定时器
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
// Code
}
DispatchSourceTimer
let timer = DispatchSource.makeTimerSource()
timer.schedule(deadline: .now() + .seconds(1))
timer.setEventHandler {
// Code
}
timer.activate()
所有计时器的优缺点是什么?我什么时候应该使用一个在另一个之上?哪种计时器方式最有效?我想出了以下几点:
定时器
优点:
- 可以失效
- 无需参考
- 可以在计划时停止。
缺点:
- 防止 CPU 进入空闲状态
- 需要在带有运行循环的队列上运行(否则什么都不会发生,甚至没有断言触发器...)
DispatchSourceTimer
优点:
- 可以取消
- 无需运行循环
缺点:
- 需要强引用,否则会立即解除分配
asyncAfter
优点: - 无需运行循环
缺点: - 不能取消(我认为)
还有更多的计时器吗?为什么会有这么多定时器?我预计所有不同的计时器都会有一些真正的差异,但我找不到它们。
这里有很多问题,您可以阅读。主要问题是:哪些定时器可用,在什么情况下我应该使用哪些定时器,为什么?
【问题讨论】:
-
试试这个链接medium.com/@danielemargutti/…,其中的差异得到了很好的解释。
-
@user3441734 这是一篇有趣的文章,但我仍然不明白什么时候该使用一个在另一个之上。
标签: swift timer grand-central-dispatch