SwiftUI/Combine 发布者是双向的吗?

这段代码的执行让我很困惑:

class RecipelistViewModel: ObservableObject {
    
    @Published var recipelist = [RecipeViewModel]()
    
    init(){

        RecipeRepository.$allRecipeVMs.map { recipes in
            recipes.map { recipe in
            recipe
            }
        }
        .assign(to: &$recipelist)
    }
}

我的理解是 SwiftUI 发布者是单向的,这意味着当 RecipeRepository.allRecipeVMs 被修改时,recipelist 也是如此。但是,我看到的行为是当 recipelist 更新时,RecipeRepository.allRecipeVMs 也会更新。我试图找到有关此的文档,但似乎找不到任何内容。

这是 RecipeViewModel 类,不确定它是否有用:

class RecipeViewModel : Identifiable,ObservableObject,Hashable{
    
    var id = UUID().uuidString
    @Published var recipe: Recipe

    init(recipe: Recipe){

        self.recipe = recipe
    }
}
baotongwudi 回答:SwiftUI/Combine 发布者是双向的吗?

目前尚不清楚您所称的“修改”是什么。 @Published 和 SwiftUI 查看 diff 值类型,而您已经创建了一个引用类型数组。仅当该对象的实例发生更改时才会发生差异,而不是在该对象本身触发其 ObjectWillChange 发布者时发生差异。

坦率地说,这是一个非常有用的设置,因为您可以使用容器来分发和管理应用程序中的依赖项,而不会导致根视图层次结构不断变化和重建。

如果您想要某种双向委托关系,您可以简单地将 VM 中的弱变量设置为 self。

本文链接:https://www.f2er.com/671.html

大家都在问