我正在尝试运行一个带有计时器的some代码,然后在满足某些条件时停止计时器。
下面是代码的相关部分:
let updateTimer = Timer.publish(every: 5, on: .main, in: .common).autoconnect()
以及.onReceive
.onReceive(updateTimer) { _ in
if (story.status == "ready"){
am.pollingFinished = true
print("Update Timr Canceled (1)")
updateTimer.upstream.connect().cancel()
}
if (am.pollingFinished) {
print("Update Timr Canceled (2)")
updateTimer.upstream.connect().cancel()
}
然而,正如您从下面的控制台打印中看到的,即使满足条件,时间也会继续运行
Console log
知道为什么吗?
2条答案
按热度按时间aurhwmvo1#
您需要手动连接并存储生成的Cancellable,而不是自动连接。这是您稍后要取消的对象。您还需要显式订阅Timer发布者。您 * 不 * 需要保留对Timer发布者的引用-只需保留Cancellable。如果您将Timer Cancellable保存在单独的类对象中,您会发现在SwiftUI下更容易处理。
老实说,我完全不明白为什么要使用Timer发布器;就个人而言,我只会使用一个真正的Timer。然而,如果你坚持使用发布者,这里有一个例子来说明我刚才描述的架构:
ctrmrzij2#
并发的例子。一切都很简单: