微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 MVC 中构建模型 - swift

如何解决如何在 MVC 中构建模型 - swift

我很困惑,在 MVC

MVC

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

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

2- Controller 相应地更新 view,即使使用委托方法 f.i.在集合视图中。

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

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

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

解决方法

你问:

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

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

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

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

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

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

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


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

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

  • 请参阅 Dave Delong 的 A Better MVC 以了解拥抱 MVC 但采用技术使其小型化和易于管理的观点。

  • 查看 Medium 的 iOS Architecture Patterns 以了解对 MVP、MVVM、Viper 等其他方法的评论。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。