You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI视图修饰器中运行任务的取消方法及崩溃解决方案

问题分析与解决方案

一、手动取消任务的实现方式

崩溃大概率是因为视图过渡期间,.task里的异步操作还在修改catOn状态,但此时视图已处于卸载/销毁的边缘。虽然SwiftUI的.task会在视图消失时自动取消,但如果想在点击切换按钮时主动提前终止任务,可以通过绑定Task实例的方式实现:

@State private var catOn = true
@State private var catTask: Task<Void, Never>? // 存储任务实例

// 切换视图的按钮动作
func switchView() {
    // 先取消任务
    catTask?.cancel()
    catTask = nil
    // 再触发视图切换逻辑(比如修改控制视图显示的@State属性)
    isShowingOtherView = true
}

// 在视图中使用
SomeView()
.background {
    GeometryReader { geo in
        ForEach(0...numCats, id: \.self) { n in
            CatView(color: n%2 == 0 ? color1 : color2, size: 15, isOn: n%2 == 0 ? catOn : !catOn)
        }
        .task {
            catTask = Task {
                while !Task.isCancelled {
                    try? await Task.sleep(for: .seconds(1.0))
                    catOn.toggle()
                }
            }
            await catTask?.value
        }
    }
}

这样在点击切换按钮时,先手动取消任务,避免后续状态修改影响正在销毁的视图。

二、更优的颜色切换实现方案

没必要用无限循环的.task,用Timer.publish结合onReceive的方式更简洁安全,SwiftUI会自动在视图消失时取消订阅,避免潜在的内存问题或崩溃:

@State private var catOn = true
private let colorToggleTimer = Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()

// 在视图中使用
SomeView()
.background {
    GeometryReader { geo in
        ForEach(0...numCats, id: \.self) { n in
            CatView(color: n%2 == 0 ? color1 : color2, size: 15, isOn: n%2 == 0 ? catOn : !catOn)
        }
    }
}
.onReceive(colorToggleTimer) { _ in
    catOn.toggle()
}

如果需要手动控制定时器启停(比如进入视图时启动,离开时停止),可以去掉.autoconnect(),在.onAppear和.onDisappear中手动管理:

@State private var catOn = true
private let colorToggleTimer = Timer.publish(every: 1.0, on: .main, in: .common)
@State private var cancellable: AnyCancellable?

SomeView()
.background {
    // ... 你的CatView代码
}
.onAppear {
    cancellable = colorToggleTimer.connect()
}
.onDisappear {
    cancellable?.cancel()
}
.onReceive(colorToggleTimer) { _ in
    catOn.toggle()
}

这种方式更符合SwiftUI的响应式设计,也更不容易出现崩溃问题。


内容的提问来源于stack exchange,提问作者soleil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:05:15