SwiftUI Timer перезапускается после отмены - PullRequest
0 голосов
/ 24 февраля 2020

Я все еще пробую таймеры, и это тоже работает. Таймер выключается через определенное время. Но как я могу перезапустить его сейчас? Я благодарен за любую помощь. Я подозреваю, что .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()
    }
}


1 Ответ

1 голос
/ 24 февраля 2020

таймер автоподключения на детской площадке

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($0)
    }

отпечатки

...
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($0)
    }

/// ...

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