没有必要丢弃TimerPublisher
本身。 Timer.publish
创建一个Timer.TimerPublisher
实例,该实例与所有其他发布者一样,仅在您为其创建订阅时才开始发出值-并在订阅关闭后立即停止发出值。
因此,无需重新创建TimerPublisher
,只需在需要时重新创建对其的订阅。
因此在声明时分配Timer.publish
,但不要autoconnect()
。每当您要启动计时器时,请在其上调用connect
并将Cancellable
保存在实例属性中。然后,每当您想停止计时器时,请在cancel
上调用Cancellable
并将其设置为nil
。
您可以在下面看到一个具有完全预览功能的视图,该视图可以在5秒后启动计时器,每秒更新一次视图,并在30秒后停止流式播放。
可以通过将发布者和订阅存储在视图模型中,然后将其注入视图中来进一步改进。
struct TimerView: View {
@State private var text: String = "Not started"
private var timerSubscription: Cancellable?
private let timer = Timer.publish(every: 1,on: .main,in: .common)
var body: some View {
Text(text)
.onReceive(timer) {
self.text = "The time is now \($0)"
}
}
mutating func startTimer() {
timerSubscription = timer.connect()
}
mutating func stopTimer() {
timerSubscription?.cancel()
timerSubscription = nil
}
}
struct TimerView_Previews: PreviewProvider {
static var previews: some View {
var timerView = TimerView()
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
timerView.startTimer()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 30) {
timerView.stopTimer()
}
return timerView
}
}
使用视图模型,您甚至不需要向视图公开TimerPublisher
(或任何Publisher
),而只需更新@Published
属性并将其显示在您视图的body
。这样一来,您就可以将timer
声明为autoconnect
,这意味着您无需手动调用cancel
,您只需nil
退出订阅引用即可停止计时器。
class TimerViewModel: ObservableObject {
private let timer = Timer.publish(every: 1,in: .common).autoconnect()
private var timerSubscription: Cancellable?
@Published var time: Date = Date()
func startTimer() {
timerSubscription = timer.assign(to: \.time,on: self)
}
func stopTimer() {
timerSubscription = nil
}
}
struct TimerView: View {
@ObservedObject var viewModel: TimerViewModel
var body: some View {
Text(viewModel.time.description)
}
}
struct TimerView_Previews: PreviewProvider {
static var previews: some View {
let viewModel = TimerViewModel()
let timerView = TimerView(viewModel: viewModel)
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
viewModel.startTimer()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 30) {
viewModel.stopTimer()
}
return timerView
}
}
本文链接:https://www.f2er.com/2020235.html