ios 计时器不会停止- .upstream.connect().cancel()

x759pob2  于 2023-02-26  发布在  iOS
关注(0)|答案(2)|浏览(137)

我正在尝试运行一个带有计时器的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
知道为什么吗?

aurhwmvo

aurhwmvo1#

您需要手动连接并存储生成的Cancellable,而不是自动连接。这是您稍后要取消的对象。您还需要显式订阅Timer发布者。您 * 不 * 需要保留对Timer发布者的引用-只需保留Cancellable。如果您将Timer Cancellable保存在单独的类对象中,您会发现在SwiftUI下更容易处理。
老实说,我完全不明白为什么要使用Timer发布器;就个人而言,我只会使用一个真正的Timer。然而,如果你坚持使用发布者,这里有一个例子来说明我刚才描述的架构:

class TimerManager: ObservableObject {
    var cancellables = Set<AnyCancellable>()
    func makeTimerPublisher() -> AnyPublisher<Date, Never> {
        let timerPublisher = Timer.publish(every: 1, on: .main, in: .default)
        timerPublisher.connect().store(in: &cancellables)
        return timerPublisher.eraseToAnyPublisher()
    }
    func stop() {
        cancellables.removeAll()
    }
}

struct ContentView: View {
    @StateObject var timerManager = TimerManager()
    @State var labelText: String = ""
    var body: some View {
        VStack {
            Text(labelText)
            Button("Stop") { timerManager.stop() }
        }
        .onReceive(timerManager.makeTimerPublisher()) { labelText = String(describing: $0) }
    }
}
ctrmrzij

ctrmrzij2#

并发的例子。一切都很简单:

struct ContentView: View {
    var body: some View {
        Text("Hello, World!").task {
            do {
                for _ in 0..<5 {
                    try await Task.sleep(for: .seconds(5))
                    print("timer fired")
                }
            } catch {
                print("timer cancelled")
            }
            print("timer done")
        }
    }
}

相关问题