我在尝试取消任务时遇到了一种奇怪的行为(或者至少是我不理解的行为)。这是一个最小的示例:我有一个任务休眠 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)
当任务被取消时,会引发错误,但您可以使用以下方法忽略引发的错误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)
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |