【问题标题】:In MVC where do you put references to your model Classes?在 MVC 中,您将模型类的引用放在哪里?
【发布时间】:2010-02-08 14:17:28
【问题描述】:

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

问题:

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

在 iPhone(和 Cocoa)应用程序中,我们有所谓的“App Delegate”,它基本上启动我们的应用程序并初始化我们的控制器,还处理 UITouch 事件。

那么 App Delegate 是控制器吗?一个模型班?两者都没有?我认为不知道这一点也会让人混淆模型引用的放置位置。

例子:

您有应用程序委托,该委托包含对您的应用程序视图控制器的引用。如果我的应用程序将使用模型类 A(它是一个网络服务器守护程序类)和一个存储该网络服务器查询的数据的 B 类。

你们会将 A 和 B 的引用存储在哪里? (应用委托?视图控制器?两者都有?)

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

【问题讨论】:

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


    【解决方案1】:

    将所有内容都放在 AppDelegate 中是很有诱惑力的,但是如果您开始这样做,那么您的 AppDelegate 将充满参考黑客。如果你在做一个严格的 MVC,那么你应该有 3 件事:

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

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

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

    最后,为了回答你的问题,我会将我对 Foo 的引用存储在 foo 控制器中。我喜欢为我的控制器使用单例,但这只是我。如果您确实使用单例,则可以执行以下操作:[[FooController sharedInstance] listOfFoos] 获取您的 Foo

    【讨论】:

    • 如果您只使用 GUI 的 .xib 文件(通过 Interface Builder),那么您的“FooViewController.m(显示 Foo)”(仅包含视图逻辑)将等同于 FooViewController.xib 吗? ?
    • 基本上是的。如果您使用 xib,您仍然会有一个支持 .m 文件,该文件就是视图控制器
    【解决方案2】:

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

    当然,如果您有一个简单的应用程序,那么如果您愿意,没有理由不让您的应用程序控制器扮演模型控制器的角色。您要避免的是包含数百行代码的文件,它们都在执行概念上不相关的任务。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        那么 App Delegate 是控制器吗?一个模型班?两者都没有?

        App Delegate 是一个控制器。

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

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

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

        控制器层的目的是让模型层和视图层自包含。模型不应该对控制器或视图层有任何了解。视图不应该知道任何关于控制器或模型层的信息。控制器的工作是作为模型一侧和视图另一侧的双端适配器。

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          所以,我会说它介于“两者都不是”和“控制器”之间,但更倾向于“两者都不是”。绝对不是“模特”!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-14
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 2012-04-26
            • 1970-01-01
            • 2011-06-10
            • 1970-01-01
            相关资源
            最近更新 更多