0

我很困惑,在 MVCMVC

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

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

2-相应Controller地更新view,即使在 collectionViews 中使用委托方法 fi。

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

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

要清楚的示例,在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
            
        }
    
}
4

1 回答 1

1

您询问:

模型是否需要完美地表示视图将要显示的内容?

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

这样我就可以将模型对象传递给视图并根据它设置视图?

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

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

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

无论如何,我建议不要在集合视图单元格中存储模型对象的副本。它只会引入混淆:如果您的 UI 允许您编辑对象,您是在单元格中编辑此副本,还是在模型中编辑?从理论上讲,您可以通过观察者传播更改,但这可能会让人感到困惑,并且这里没有必要。


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

以下是一些重新思考 MVC 含义和/或考虑一些合乎逻辑的替代方案的链接:

  • 请参阅 Dave Delong 的A Better MVC以了解采用 MVC 的观点,但要使用技术来保持它们的小且易于管理。

  • 有关MVP、MVVM、Viper 等其他方法的评论,请参阅 Medium 的iOS 架构模式。

  • 有关该主题的另一个很好的讨论,请参阅 Krzysztof Zabłocki 的iOS 应用程序架构。

于 2020-12-30T01:32:44.257 回答