如何在 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 以获得关于该主题的另一个很好的讨论。
我很困惑,在 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 以获得关于该主题的另一个很好的讨论。