这段代码的执行让我很困惑:
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
}
}
答案 0 :(得分:2)
目前尚不清楚您所称的“修改”是什么。 @Published 和 SwiftUI 查看 diff 值类型,而您已经创建了一个引用类型数组。仅当该对象的实例发生更改时才会发生差异,而不是在该对象本身触发其 ObjectWillChange 发布者时发生差异。
坦率地说,这是一个非常有用的设置,因为您可以使用容器来分发和管理应用程序中的依赖项,而不会导致根视图层次结构不断变化和重建。
如果您想要某种双向委托关系,您可以简单地将 VM 中的弱变量设置为 self。