在MVC中,您在哪里放置对模型类的引用?

时间:2010-02-08 14:17:29

标签: iphone cocoa cocoa-touch model-view-controller

我一直想知道一段时间后,在询问不同的人并且没有任何人提供我称之为“至少有点具体的答案”之后:

问题:

在iPhone应用程序中,应用程序是否应该保留对其模型类的引用(使用MVC方法)?

在iPhone(和Cocoa)应用程序中,我们称之为“App Delegate”,它基本上启动了我们的应用程序,并且在我们的控制器中,也处理UITouch事件。

App代理是一个控制器吗?模特班?这两个都没有?我认为不知道这也让人知道如何放置模型参考资料。

示例:

您拥有Application Delegate,该委托包含对Application的View Controller的引用。如果我的应用程序将使用Model Class A(它是一个webserver守护程序类),而一个B类存储由该Web服务器查询的数据。

你们在哪里存储对A和B的引用? (App Delegate?查看控制器?两者?)

这里有很多选项,但作为一个例子,我真的很想知道你们如何使用mvc组合​​这个只使用一个View的应用程序。

5 个答案:

答案 0 :(得分:7)

将一切都放在AppDelegate中很诱人,但如果你开始这样做,那么你的AppDelegate将充满参考黑客。如果你正在做一个严格的MVC,那么你应该有三件事:

  • 模特
  • 视图控制器(仅适用于视图逻辑)
  • 控制器(用于在视图和模型之间进行协调)

例如,我有一个模型Foo和一个Foo控制器。我会:

  • Foo.m(型号)
  • FooViewController.m(显示Foo)
  • FooController.m(控制逻辑)

最后,为了回答你的问题,我会在foo控制器中存储我对Foo的引用。我喜欢为我的控制器使用单身人士,但那就是我。如果你使用单身人士,你可以这样做:[[FooController sharedInstance] listOfFoos]来获得你的Foo's

答案 1 :(得分:3)

在我的应用程序中,我通常将AppDelegate类重命名为AppController,如果这有助于在概念上更好地解释事物。您的app控制器负责创建和/或配置模型控制器(管理模型对象的集合)和窗口或视图控制器,在需要时在它们之间设置引用,并在这些控制器上调用方法以响应NSApplication委托方法或主菜单中的高级操作方法。根据应用程序的复杂程度,您可能还有在app控制器外部创建的其他模型或视图控制器。

当然,如果你有一个简单的应用程序,没有理由不让你的app控制器扮演模型控制器的角色。您要避免的是具有数百行代码的文件,所有代码都执行与概念无关的任务。

答案 2 :(得分:1)

传统上,控制器会创建模型,然后使用该模型初始化视图。然后控制器监听模型中的变化并查看并通过此协调程序的流程。这将是我的通用答案,也许实际上对于iPhone开发来说会有所不同。

答案 3 :(得分:1)

  

在iPhone应用程序中,应用程序是否应该保留对其模型类的引用(使用MVC方法)?

控制器层保留对模型层的引用。

  

App代理是一个控制器吗?模特班?这两个都没有?

App Delegate是一名控制员。

  

你们在哪里存储对A和B的引用?

A和B是通常由控制器层创建和拥有的模型类。

  

我真的很想知道你们如何使用mvc组合​​这个只使用一个View的应用程序。

控制器层的目的是允许模型和视图层自包含。模型不应该知道控制器或视图层的任何信息。视图不应该知道控制器或模型层的任何信息。控制器的工作是在一侧为模型的双端适配器,在另一侧为视图。

我会像这样设置你的示例应用程序:

  • UIApplication委托给AppDelegate。
  • 如果您的服务器类(A)的操作是简单:
    • AppDelegate创建并拥有服务器类A的实例。
  • 如果您的服务器类(A)的操作是复杂:
    • 创建专用控制器类(C)来控制服务器。
    • AppDelegate创建并拥有类C的实例。(A)的每个实例的(C)的一个实例。
    • C类的每个实例都创建并拥有一个A类实例。
  • AppDelegate创建并拥有ViewController类的实例,该实例加载并拥有您的视图。

在问题中不清楚B类的目的是什么。

  • 如果只是使用A的一大块数据(如配置数据或静态网站数据),我会让它由服务器(A)创建并拥有。
  • 如果是在服务器操作期间创建并且需要在视图中显示的数据,那么您可能需要以下内容:
    • A拥有的可变数组,用于保存B的实例。
    • 另一个控制器类(D),用于引用该数组并充当视图的数据源/委托。

答案 4 :(得分:0)

我发现在大多数情况下,AppDelegate提供了一个放置一些基本功能的好地方(比如你想在每个控制器中应用的背景图像),但是你想在其他地方拥有额外的控制器和模型代码。 navController或rootController通常会作为属性放在AppDelegate上。

所以,我会说它介于“既不”又“控制器”之间,而是倾向于“不”。绝对不是“模特”!