SwiftUI Timer取消后重启

SwiftUI Timer restart after canceling

我仍在试用计时器,这也行得通。定时器在一定时间后退出。但是现在怎么重启呢?我很感激任何帮助。我怀疑用.autoconnect ()。但是我真的不明白。

import SwiftUI

struct ContentView: View {

    @State private var timerHold = false
    @State var waitingTimerCount = 0
    let waiting = ["A","B","C",]
    let waitingTimer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        VStack {
            Button(action: {
                self.timerHold = true
                 }) { Text("Button") }

        if timerHold == true {
            Text(verbatim: waiting[waitingTimerCount])
                .onReceive(waitingTimer) { timer in
                    self.waitingTimerCount = (self.waitingTimerCount + 1) % self.waiting.count
                        if self.waitingTimerCount == 3 {
                            self.timerHold = false
                            self.waitingTimerCount = 0
                            self.waitingTimer.upstream.connect().cancel()
                            }
                        }
                    }
                }
    }
}

//??
// self.waitingTimer.upstream.autoconnect()

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


playground 中的自动连接计时器

import PlaygroundSupport
import Combine
import Foundation
PlaygroundPage.current.needsIndefiniteExecution = true

var cancellable: AnyCancellable?
// start automatically
cancellable = Timer.publish(every: 1, on: .main, in: .default)
    .autoconnect()
    .sink {
        print([=10=])
    }

打印

...
2020-02-24 02:22:20 +0000
2020-02-24 02:22:21 +0000
2020-02-24 02:22:22 +0000
2020-02-24 02:22:23 +0000
2020-02-24 02:22:24 +0000
2020-02-24 02:22:25 +0000
2020-02-24 02:22:26 +0000
...

手动启动/停止定时器

let timerPublisher = Timer.publish(every: 1.0, on: RunLoop.main, in: .default)
cancellable = timerPublisher
    .sink {
        print([=12=])
    }

/// ...

// start publishing time
let cancellableTimerPublisher = timerPublisher.connect()
// stop publishing time
cancellableTimerPublisher.cancel()