如何在 MVC 中构建模型 - swift

How to construct Model in MVC - swift

我很困惑,在 MVC 中

模型不应该与 view 对话,但到目前为止我一直看到以这种方式工作的项目:

1- Controller 从数据库创建模型对象,并将其存储在某处(数组、字典、变量)

2- Controller 相应地更新 view,甚至使用委托方法 f.i。在 collectionViews 中。

我的问题是:模型是否需要完美地表示视图将要显示的内容?以便我可以将模型对象传递给视图并根据它设置视图?

到目前为止,我一直在实施这个过程,但我想知道这种方法是否有问题。

要清楚的示例,在 controller 中:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! PostCollectionviewCell
    cell.currentItem = self.posts[indexPath.item] as? Post 
    return cell
}

view 使用 property observer:

   var currentItem :Post?{
    didSet{
            guard let thumbnailUrlString = self.currentItem?.thumbnailUrl else { return }
            self.imageview.sd_setImage(with: URL(string: thumbnailUrlString))
            bottomLayer.isHidden = true
            
        }
    
}

您问的是:

does the model need to represent perfectly what's going to be displayed by the view?

是的,根据定义,模型是真正要显示的内容的表示。

So that I can pass the model object to the view and set the view according to it?

可以,但不一定要这样做。这是你的电话。这个想法(将模型 object 传递给视图)当然是一种方便的模式。对于琐碎的应用程序,这很好。

问题是您的视图与模型纠缠在一起。相反,您可能希望将您的视图视为更抽象的东西,例如,旨在显示由图像和文本字符串组成的事物列表。然后该视图可用于显示由图像和标题组成的任何事物列表。

至少,您可以定义视图以使用协议(例如,可以在列表中显示的事物的协议),而不是引用具体的模型类型。或者为您的单元格提供一个简单的 configure(image:text:) 方法,并让控制器指定要使用的模型属性。

无论如何,我建议不要在 collection 视图单元格中存储模型 object 的副本。它只会引起混淆:如果您的 UI 允许您编辑 object,您是在单元格中还是在模型中编辑此副本?理论上,您可以通过观察者传播更改,但它可能会造成混淆,这里没有必要。


我的印象是您可能将视图控制器视为 MVC“控制器”。相反,许多人更多地认为它是 MVC“视图”的一部分,因为它从根本上讲就是准备和填充视图、对用户输入做出反应以及响应 UI 事件。我们中的许多人创建了更抽象的“控制器”(或演示者或视图模型),一些与 UIKit(或其他)无关的东西。这也有让我们为业务逻辑编写单元测试的优点,完全独立于 UI.

这里有一些重新思考 MVC 含义的链接 and/or 考虑一些合乎逻辑的替代方案:

  • 请参阅 Dave Delong 的 A Better MVC,了解拥抱 MVC 但采用技术使它们保持小巧和易于管理的观点。

  • 请参阅 Medium 的 iOS Architecture Patterns 查看其他方法,包括 MVP、MVVM、Viper 等

  • 请参阅 Krzysztof Zabłocki 的 iOS Application Architecture 以获得关于该主题的另一个很好的讨论。