Cocoa模型视图控制器:在哪里进行计算

时间:2013-01-12 19:27:44

标签: objective-c model-view-controller

我正在开发一个软件,它接受用户输入,对其进行大量计算,然后根据计算结果显示数字和图形。我认为MVC方法尽可能好。以下是我的问题:

  1. 我应该在哪里存储用户输入(将在表格视图中显示)?它应该存储在控制器类中所需的ArrayController中还是存储在模型(类)中的其他数组中?到目前为止我所理解的是信息应存储在模型中。

  2. 我应该在哪里进行所有必要的计算,其输出用于视图中的图形?这些应该在模型中还是在视图控制器(类)中完成?

  3. 在笔尖中为表视图设置单独的控制器类是否有意义?现在我通过相应的窗口控制器(类)中的ArrayController处理这些数据。

  4. 我提出了一些非常普遍的问题,因为我知道MVC方法独立于代码,但我在显示更具体的代码方面没有任何问题。

    提前致谢。

3 个答案:

答案 0 :(得分:2)

  

我在哪里存储应该在表格视图中显示的用户输入。它应该存储在控制器类中所需的数组控制器中还是存储在模型(类)中的其他数组中?到目前为止我所理解的是信息应该存储在模型中。

控制器类应该读取它并将其存储在模型类中。视图和模型不直接相互通信。

  

在哪里进行所有必要的计算,对视图中的图形进行输出。应该在模型中还是在视图控制器(类)中完成?

在控制器中,绝对是。

  

在nib中为表视图设置单独的控制器类是否有意义?现在我通过相应的窗口控制器(类)中的数组控制器处理这些数据。

是的,这是有道理的。您也可以使用表视图控制器 - 您可以拥有尽可能多的控制器。

答案 1 :(得分:1)

大多数iOS实现 - 包括我见过的大量教程 - 并没有严格遵循MVC方法。换句话说,UIViewController子类(或UITableViewController子类)用作控制视图(V)作为控制器本身(C)的对象。

从技术上讲,这些控制器就是视图层。

您的UITableView期望其控制器成为数据源委托,这意味着它必须符合相关的数据源协议。实际上,视图控制器通常将self指定为数据源委托(或IB指定文件的所有者,通常是视图控制器)。

回答你的问题:

  1. 我想说数据应该在模型中表示。为了支持该表,您可以使用一些NSArrayNSDictionary结构(带索引路径)来引用模型中的对象或包含模型中数据的副本。如果您有专用控制器,那么它应该将模型的数据链接到视图的数据。

  2. 所有与业务逻辑有关的计算都应该在控制器中完成。如果您决定遵循已建立的具有两个目的的视图控制器的模式,那么这将是您计算的地方。应始终在视图控制器中完成直接影响外观的计算(颜色,绘制的xy值,宽度和高度值等)。

  3. 正如我之前所说,根据MVC模型,使用(或滥用)视图控制器(窗口控制器是视图控制器)作为控制器是相当普遍的。我决定采用这种方法,以便我可以轻松地整合来自tutoreals或Stack Overflow答案的代码片段。但最终,这取决于你。但是,当您拥有单视图应用程序时,使用窗口控制器是可取的。一旦开始使用导航视图控制器来推送视图,标签栏等,如果您没有使用专用控制器对象,则应该(ab)使用相关的UIViewController子类。

答案 2 :(得分:1)

您可以将数据数组与计算代码放在一个类中:模型。然后,视图控制器将读取用户输入并将其放入此模型类中。这是一个很好的面向对象设计,可以很好地保持数据及其操作,同时保持完全不受UI相关代码的影响。

如果计算不会花费太多时间,您可以在主线程中执行它们,以便视图控制器调用模型方法,该方法返回结果。或者,根据数据的形状,模型可能会使结果与其他方法和/或属性一起使用。

如果计算可能需要更长时间,则应考虑使用GCDdispatch_async()在模型内的优先级较低的线程上运行它们。你不想长时间阻止用户界面 - 我会说,大约一秒就是限制。在这种情况下,最好在模型的计算方法中添加就绪块,以便模型可以在计算准备就绪时通知视图控制器。不要忘记在主线程上运行此块,以防止视图控制器中的UIKit操作混乱。 (如果您需要我上面提到的任何内容的详细信息或代码,请告诉我,但大多数内容应该很容易在Stack Overflow或其他地方找到。)

最后,包含表视图的NIB的单个视图控制器是可行的方法。您通常会在UIView子视图中放置UI功能(例如图表),而不是在额外的UIViewController中。然后,您可以将子视图放在NIB上(或以编程方式在视图控制器中添加)。