我是一个入门的iOS程序员,使用模型作为设计模式:我的模型对我的视图一无所知(为了使它与任何视图兼容),我的视图不了解我的模型,所以它们通过我的控制器进行交互。视图与控制器交互的一种非常常见的方式是通过委托:当用户与应用程序交互时,我的视图将通知我的控制器,它可以调用我的模型的一些方法,并在必要时更新我的视图。
然而,让我的控制器成为我的模型的代表是否有意义呢?我不相信这是一条路。例如,如果我的模型没有足够的信息来完成任务,那么可以方便地通知我的控制器某个进程正在完成,或者要求用户提供额外的输入。但是,这样做的缺点是,我的控制器将既是我的控制器又是我的模型的委托,因此没有一种真正正确的方法来通知我的模型在我的视图中发生的变化,反之亦然。(如果我错了,请纠正我。)
结论:我不认为让我的控制器作为我的模型的代表是个好主意,但只是作为我的观点的代表是好的。这是大多数MVC模型处理的方式吗?或者,是否有一种方法让控制器既是控制器又是模型的委托,并在它们之间进行适当的通信?
就像我说的,我是个初学者,所以我想要立即做正确的事情,而不是花很多时间在那些无论如何都行不通的模型上。:)
发布于 2012-10-14 15:35:46
我将特别介绍iOS,因为它有自己的概念和一些语言特性,这使得它的处理方法非常合适。在iOS中,控制器模型层的交互通常基于观察者模式的一些变体(键值观察(KVO),也包括NSNotification
)。我发现模型层经常不像视图-控制器层接口那样来回进行交互(考虑动态的、功能齐全的表视图的复杂性),所以委托并不是最适合的。通常情况下(用户输入、网络请求等)会改变模型,控制器相应地通过更新视图来响应。但委托仍然用于长期运行的动态交互,例如显示频繁更新数据集内容的表视图(请参见NSFetchedResultsController
)。
至于让控制器作为视图和模型的委托的问题,除了会降低控制器的内聚力外,没有其他固有的问题,有时将控制器层划分为视图控制器和数据控制器是一个很好的选择。使用KVO或NSNotification来观察模型层中的更改通常是非常简单的,因此您不会发现迫切需要提取一个新类。
发布于 2012-10-14 20:50:24
当您谈到与iOS有关的控制器时,您通常是在谈论视图控制器--即用来管理视图层次结构的对象。iOS应用程序中的每个“屏幕”都有自己的视图控制器,当用户浏览应用程序时,这些控制器就会来来去去。
另一方面,模型是一个对象或对象图,它表示应用程序所操作的数据,而不是仅仅因为用户在应用程序中移动而改变。
如果要使用视图控制器作为模型的委托,则需要使用与模型的生存期相似的视图控制器。在基于导航的应用程序中,这通常意味着根视图控制器,它通常是首先创建模型的对象。(另一个候选对象是应用程序委托,它是另一个长期存在的对象,有时会创建模型。)
视图控制器没有理由不能成为一个或多个视图以及模型的委托。只是要仔细考虑上面描述的生命周期问题。另外,考虑您的模型是否真的需要委托,以及委托是否是传递模型可能需要发送的任何消息的正确方式。其他选项包括KVO和通知。
https://softwareengineering.stackexchange.com/questions/169859
复制