我希望解决在Xcode中启用完整并发判断后收到的并发警告.

下面是一个简单的例子来说明警告.假设我有一个ContentView,它在后台线程上有一个长时间运行的任务.当我在Task {...}的任务中调用长时间运行的任务时,我得到了一个警告:"在主参与者隔离上下文之外传递不可发送类型'ContentView'的参数可能会引入数据竞争".当我在Xcode中启用并发设置以完成时,我会收到这个警告. 我try 了这个建议,使ContentView SREQ,但它会产生额外的警告(见下面的第二张图片),在我的情况下将不起作用. 我该怎么办?感谢任何帮助/指导

参见下面的代码:

struct ContentView: View {
    @State private var disable: Bool = false
    @State private var value: Double = 0

    var body: some View {
        VStack {
            Button {
                disable = true
            } label: {
                Text("Press")
            }
            .task {
                await value = self.fetchValue() //<---Here is the warning. See image below
            }
            Text("\(value)")

        }
    }
}

extension ContentView {
    
    func fetchValue() async -> Double {
        //long running task
        try? await Task.sleep(nanoseconds: 60)
        return 2.0
    }
}

以下是警告:

enter image description here

enter image description here

推荐答案

SwiftUI View没有连接到actorbody@MainActor装饰,但不是View本身.

当你在View中有func时,你可以用@MainActor来装饰View,就像你用"视图模型"一样.

import SwiftUI
@MainActor // Decorate the View
struct AsyncTest: View {
    @State private var isRunning: Bool = false
    @State private var value: Double = 0

    var body: some View {
        VStack {
            Button {
                isRunning = true
            } label: {
                Text("Press")
            }.disabled(isRunning)
                .task(id: isRunning) {
                    guard isRunning else {return}
                    value = await fetchValue() 
                    isRunning = false
                }
            if isRunning {
                ProgressView()
            }
            
            Text("\(value)")

        }
    }
}

extension AsyncTest {
    
    func fetchValue() async -> Double {
        //long running task
        try? await Task.sleep(nanoseconds: 60)
        return 2.0
    }
}
#Preview {
    AsyncTest()
}

Swift相关问答推荐

try 在SwiftUI中做5星评级

体积单位从夸脱转换为杯似乎关闭了

阴影动画的动画不流畅

在SwiftUI中使用自定义图像填充列表行的正确方法

将NavigationSplitView更改为NavigationStack

文件命名&NumberForMatter+扩展名&:含义?

在SwiftUI中,我如何确保带有符号的单词不会被拆分为两行?

如何使用Duration.TimeFormatStyle以h m s格式快速格式化时间

使用UICollectionViewFlowLayout创建水平的UICollectionView,并同时将单元格对齐到左边和右边的能力

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

URL appendPathComponent(_:) 已弃用?

如何将视图添加到多行文本视图的末尾?

如何在一个视图控制器中创建具有相同行为的多个集合视图?

SwiftUI:当 currentIndex 值更改时,数组中的第 n 个视图是否已换出?

Swift 中的Combine和didSet有什么区别?

自定义选取器的出现导致其他视图重新排列

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

如何从 Swift 中的字符串生成条形码?

快速覆盖属性