我很难理解DispatchSourceTimer, Timer和asyncAfter之间的主要区别(在我的情况下,需要每X秒运行一次任务,尽管了解计时器的差异可能很有用)。
(或者除了上述计时器之外,Swift中是否有其他(更有效的)调度机制?)
在何种情况下,
我想在我的应用程序中每15秒安排一次工作,使用私有队列。这意味着我必须使用DispatchSourceTimer,因为我在不是主线程的队列上(或者将runloop添加到队列并使用Timer)。然而,我甚至没有看到使用Timer的任何好处。也许有另一种操作,可以在私有队列上每X秒安排工作,比DispatchSourceTimer更有效率,但我没有找到更好的解决方案。
DispatchSourceTimer是否比Timer更有效率?还是我应该使用asyncAfter进行自调用方法?
以下是创建计时器的代码。
asyncAfter
(或者除了上述计时器之外,Swift中是否有其他(更有效的)调度机制?)
Timer
需要在当前队列上启动活动运行循环。 DispatchSourceTimer
不需要这样做。Timer
防止CPU进入空闲状态。 DispatchSourceTimer
/asyncAfter
是否也适用于此?在何种情况下,
Timer
优先于DispatchSourceTimer
/asyncAfter
?当然还有它们之间的区别是什么?我想在我的应用程序中每15秒安排一次工作,使用私有队列。这意味着我必须使用DispatchSourceTimer,因为我在不是主线程的队列上(或者将runloop添加到队列并使用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
优点: - 不需要运行循环
缺点: - 无法取消(我认为)
还有其他计时器吗?为什么有这么多计时器?我期望在所有不同的计时器中看到一些真正的差异,但我找不到它们。
如您所读,有很多问题。主要问题是:有哪些计时器可用,我应该在什么情况下使用哪些计时器,为什么?