如何解决如何在 MVC 中构建模型 - swift
模型永远不应该与 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 举报,一经查实,本站将立刻删除。