SwiftUI:演员和视图 - 在并发执行的代码中不允许对'inout'参数'self'进行可变捕获

3

我将我的数据存储在一个Actor中。我需要在视图上显示这些数据。我发现唯一的方法是通过使用await命令在Actor上启动一个任务来加载数据。这种方式感觉很笨拙,而且还给我带来了一个我不理解的错误。

Mutable capture of 'inout' parameter 'self' is not allowed in concurrently-executing code

这是我的代码:

actor SimpleActor
{
    func getString() -> String
    {
        return "some value"
    }

}

struct SimpleView: View
{
    var actor: SimpleActor
    @State var value: String
    
    init()
    {
        actor = SimpleActor()
        
        Task
        {
            value = await actor.getString() // error here
        }
    }
    
    var body: some View
    {
        Text(value)
            .width(100, alignment: .leading)
    }
}

如何以最佳方式完成这个任务?

2个回答

2

代码中存在很多问题。例如,如果不将简单属性标记为@State(Object),则无法修改它。而且你不能在Task内部初始化一个没有默认值的属性。

基本上,将actor声明为@StateObject并采用ObservableObject

此外,在.task修饰符中获取值,并给value设置一个默认值。

actor SimpleActor : ObservableObject
{
    func getString() -> String
    {
        return "some value"
    }

}

struct DetailView: View
{
    @StateObject var actor = SimpleActor()
    @State private var value = ""
    
    var body: some View
    {
        Group {
            Text(value)
        }.task {
            value = await actor.getString()
        }
            
    }
}

0

类似这样的方式是实现你想要的功能的常见方法。

actor SimpleActor: ObservableObject {
    func getString() -> String {
        return "some value"
    }
}

struct SimpleView: View {
    @StateObject var actor = SimpleActor()
    @State var value: String = ""
    
    var body: some View {
        Text(value)
            .frame(width: 100, alignment: .leading)
            .task {
                value = await actor.getString()
            }
    }
}

.task 是 iOS 15 或以上版本的功能,如果需要兼容 iOS 13+,可以改用 .onAppear


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接