【发布时间】:2021-04-06 11:29:03
【问题描述】:
模型不应该与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
}
}
【问题讨论】:
-
IMO “控制器从数据库创建模型对象,将其存储在某个地方”是一个最小的解决方案,它在现实生活中几乎从不工作,因为这意味着您每次控制器都要后端 被重新创建。或者你也在你的视图控制器中转储了一些缓存。最后你有一个怪物。然后你想添加另一个视图控制器(比如显示细节),你需要重复这个工作,或者需要在各个控制器之间来回传递数据。
-
更好的选择是将“创建要显示的模型”(这是一个视图控制器作业)与“从数据库中检索对象,将其存储在某处”(可能是某种服务)分开,所有控制器都可以访问,获取他们需要的数据,并创建适合他们的模型。这也回答了您的问题:“服务”将拥有原始形式的数据 - 从数据库中检索并缓存。而“控制器”将仅包含与视图当前状态相关的数据,以最易于视图使用的形式。
-
谢谢@KirilS。 ,“某种服务”是指 Firestore 扩展(根据我使用 Firebase 作为后端)?
-
我更多地考虑了服务层 (emacsway.github.io/en/service-layer),但可以肯定的是,您可以从简单的数据源开始,如果需要,让它们演变成服务层。要点是您在设计早期将“您检索的数据”与“您显示的数据”分开,并让这两个部分仅在定义明确的协议中进行通信
标签: ios swift model-view-controller model property-observer