SwiftUI 中的任务取消

Pau*_*lle 4 ios swift swiftui

我在尝试取消任务时遇到了一种奇怪的行为(或者至少是我不理解的行为)。这是一个最小的示例:我有一个任务休眠 30 秒,然后递增计数器。

但是,如果我在 30 秒过去之前对该任务调用 .cancel(),则计数器会立即递增。

我本以为取消任务不会增加计数器值;有人知道这里发生了什么吗?

谢谢你!

import SwiftUI

struct ContentView: View {
    @State var task: Task<Void, Never>? = nil  // reference to the task
    @State var counter = 0
    
    var body: some View {
        VStack(spacing: 50) {
            
            // display counter value and spawn the Task
            Text("counter is \(self.counter)")
                .onAppear {
                    self.task = Task {
                        try? await Task.sleep(nanoseconds: 30_000_000_000)
                        self.counter += 1
                    }
                }

            // cancel button
            Button("cancel") {
                self.task?.cancel()  // <-- when tapped before 30s, counter value increases. Why?
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*son 5

当任务被取消时,会引发错误,但您可以使用以下方法忽略引发的错误try?

这是代码的一个变体,它将对取消做出正确的反应

self.task = Task {
    do {
        try await Task.sleep(nanoseconds: 30_000_000_000)
        self.counter += 1
    } catch is CancellationError {
        print("Task was cancelled")
    } catch {
        print("ooops! \(error)")
    }
Run Code Online (Sandbox Code Playgroud)