SwiftUI 决定放置逻辑的最佳 viewModel

Posted

技术标签:

【中文标题】SwiftUI 决定放置逻辑的最佳 viewModel【英文标题】:SwiftUI Deciding the best viewModel to put logic 【发布时间】:2020-05-14 19:11:35 【问题描述】:

假设我有一个与 Instagram 类似的应用程序。有一个名为ItemView 的视图显示有关项目的详细信息。在此视图中,有一个按钮可以保存项目以供以后使用。就像 Instagram 一样。

我有两个视图模型。 ItemViewModel 用于 ItemView 和另一个称为 UserViewModel

class ItemViewModel: ObservableObject 
    @Published var item: Item

    init(item: Item) 
        self.item = item
    

    // here?
    func saveItem() 
        //
    



class UserViewModel: ObservableObject 
    @Published var savedItems: [SavedItem] = []
    @Published var item: Item

    init(item: Item) 
        self.item = item
    

    // or here?
    func saveItem(item: Item) 
        //
    


所有已保存项目的数组,因为它们属于用户,所以保存在UserViewModel

问题是saveItem() 的此功能是否属于ItemViewModel,因为此按钮位于ItemView 中,还是属于UserViewModel,因为这是特定于用户并且用户可以保存项目?哪个 viewModel 更适合这个?

【问题讨论】:

【参考方案1】:

如果 savedItems 属于用户,则由用户负责处理,因此 saveItem() 属于 UserViewModel。

【讨论】:

如何检查特定项目是否已保存? isSaved() 这是否也属于 userviewmodel,因为 savedItems 属于用户还是属于 itemViewModel ? isSaved 是 Item 的一个特性/属性,因此它的 Item 的责任,所以它应该属于 Item。 当您有这种疑问时,请提出问题:谁将执行该行为?应该在哪里采取行动?这对我来说很清楚:) Item 将具有 isSaved 属性对我来说没有意义,为什么要关心它是否保存?您只需将该项目添加到用户保存的Item 数组中。然后你可以在用户isSaved(item:)->Bool 上设置一个函数,告诉你给定的项目是否被这个用户保存。

以上是关于SwiftUI 决定放置逻辑的最佳 viewModel的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?

实体组件系统:渲染逻辑的放置位置

SwiftUI:基于 WebView 状态禁用/重新启用按钮

ASP.NET MVC 2 在哪里放置逻辑

SwiftUI 如何不在列表中复制 ViewModel

SwiftUI 如何临时为视图颜色的前景颜色设置动画?