【问题标题】:Organizing iOS project for MVC design pattern为 MVC 设计模式组织 iOS 项目
【发布时间】:2011-07-10 19:38:38
【问题描述】:

我正在开发一个适用于 iPhone 的多视图应用程序,目前我的视图 (VIEW) 已设置并且它们的转换 (CONTROLLER?) 运行良好。现在我想为实际的程序数据(模型)添加对象。

我的问题是:我应该如何构建我的数据以符合模型视图控制器 (MVC) 设计模式?我知道我应该创建单独的类来实现我的数据结构,并且我的控制器类可以将消息从视图传递给它们,但是我应该检查任何其他组织考虑因素吗?尤其是 Cocoa Touch、Xcode 或 iOS 特有的那些?

其他细节:播放预先录制的以及可能是用户生成的音频也很重要。我知道这些是模型元素,但它们与“V”和“C”的关系我仍然有点模糊。我想当用户操作需要音频播放时,控制器应该将消息传递给模型以准备适当的声音,但是播放的调节究竟应该在哪里进行呢?在与我想象的 ViewController 不同的“PlayerController”中?

非常感谢并原谅我的 MVC 新手。

【问题讨论】:

  • 控制器与其说是关于视图之间的转换,不如说是关于管理视图实际执行的操作。

标签: cocoa-touch xcode model-view-controller ios project-organization


【解决方案1】:

Caleb 很好地介绍和概述了如何思考这个问题。在您的特定情况下,以下是您可能会给出描述的一些部分:

  • Clip (M) - 负责保存实际的音频数据。它会知道如何解释数据并给出有关它的信息,但它实际上不会播放任何东西。

  • 播放器 (V) - 实际上在扬声器上播放剪辑。是的,这是 MVC 中的一种 view。音频只是另一种呈现方式。也就是说,你永远不会称它为“PlayerView”,因为这表明它是 UIView 的子类。

  • PlayerView (V) - 播放器的屏幕表示。对 Clips 一无所知。

  • ClipManager (C) - 一个对象,它将跟踪系统中的所有剪辑并管理从网络中获取它们、添加和删除它们到缓存等。

  • PlayerViewController (C) - 从 ClipManager 中检索 Clip,并协调 Player 和 PlayerView 以显示和播放它,以及任何其他 UI 元素(如“后退按钮”等)。

这只是一个示例,说明您如何将其分解为一些理论上的音频播放器应用程序。有许多正确的 MVC 方法可以做到这一点,但这是一种思考方式。

【讨论】:

  • 优秀的细分。我认为这几乎涵盖了应用程序音频播放器部分的组织。 ClipManager 可能很方便,我还没有将它视为一个单独的组件。非常感谢。
  • ClipManager 应该是控制器还是模型的一部分?据我了解,模型不仅仅是关于应用程序可以访问它的原始数据,而且是独立于用户界面的核心应用程序行为。正如@Caleb 定义的那样,模型既是数据也是逻辑。
  • ClipManager 是我倾向于称之为“模型控制器”的东西,以区别于“视图控制器”。正如您所建议的那样,将模型控制器视为更大“模型”的一部分通常是最有帮助和最准确的。但在模型中,将“数据”和“控制器”(“经理”)视为分离是有用的。使您的数据过于智能是一个常见的设计问题。长话短说,你是对的,但我不会在没有解释的情况下将 ClipManager 标记为“模型”。
【解决方案2】:

约翰·沃芬勋爵(我敢肯定,他之前的某个人)说:“性格就是你在黑暗中的样子。”好吧,模型就是应用程序在无人看时的样子——它是定义应用程序行为方式的数据和逻辑,无论它在屏幕上如何呈现。

假设您决定为您的应用程序添加一个命令行界面。您仍然希望使用相同的结构来管理数据,并且基于数据进行排序、筛选和计算的逻辑也应该相同。无论用户如何查看或与应用交互,应用中仍然重要/有用的代码就是模型。

模型可以非常简单,完全由标准对象组成。 iOS 应用程序通常更多的是检索、存储和显示数据,而不是处理数字,因此拥有一个仅包含字典数组或字典层次结构的模型并不罕见。如果您查看 Core Data 的 NSManagedObject 类,它在许多方面与 NSMutableDictionary 相似。所以,如果合适的话,不要害怕使用标准对象。

也就是说,您当然也可以创建自己的模型对象,如果您希望对数据强制执行某些要求,或者如果您希望能够从数据中获取信息,这将非常有用。

初学者经常想知道每个控制器如何访问模型。一些人提倡为此使用单例模式,主要是因为它提供了一个单一的、共享的、全局可访问的对象。我不推荐这个。相反,在您的应用程序中有一些高级对象,例如应用程序委托创建/加载模型(这可能是许多单独对象的图),并将指向模型的指针指向任何需要它的视图控制器。如果这些控制器依次创建其他视图控制器,它们可以再次向其子控制器提供指向模型(或模型的一部分)的指针。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多