我正在开发一个软件,它接受用户输入,对其进行大量计算,然后根据计算结果显示数字和图形。我认为MVC方法尽可能好。以下是我的问题:
我应该在哪里存储用户输入(将在表格视图中显示)?它应该存储在控制器类中所需的ArrayController
中还是存储在模型(类)中的其他数组中?到目前为止我所理解的是信息应存储在模型中。
我应该在哪里进行所有必要的计算,其输出用于视图中的图形?这些应该在模型中还是在视图控制器(类)中完成?
在笔尖中为表视图设置单独的控制器类是否有意义?现在我通过相应的窗口控制器(类)中的ArrayController
处理这些数据。
我提出了一些非常普遍的问题,因为我知道MVC方法独立于代码,但我在显示更具体的代码方面没有任何问题。
提前致谢。
答案 0 :(得分:2)
我在哪里存储应该在表格视图中显示的用户输入。它应该存储在控制器类中所需的数组控制器中还是存储在模型(类)中的其他数组中?到目前为止我所理解的是信息应该存储在模型中。
控制器类应该读取它并将其存储在模型类中。视图和模型不直接相互通信。
在哪里进行所有必要的计算,对视图中的图形进行输出。应该在模型中还是在视图控制器(类)中完成?
在控制器中,绝对是。
在nib中为表视图设置单独的控制器类是否有意义?现在我通过相应的窗口控制器(类)中的数组控制器处理这些数据。
是的,这是有道理的。您也可以使用表视图控制器 - 您可以拥有尽可能多的控制器。
答案 1 :(得分:1)
大多数iOS实现 - 包括我见过的大量教程 - 并没有严格遵循MVC方法。换句话说,UIViewController
子类(或UITableViewController
子类)用作控制视图(V)和作为控制器本身(C)的对象。
从技术上讲,这些控制器就是视图层。
您的UITableView
期望其控制器成为数据源委托,这意味着它必须符合相关的数据源协议。实际上,视图控制器通常将self
指定为数据源委托(或IB指定文件的所有者,通常是视图控制器)。
回答你的问题:
我想说数据应该在模型中表示。为了支持该表,您可以使用一些NSArray
或NSDictionary
结构(带索引路径)来引用模型中的对象或包含模型中数据的副本。如果您有专用控制器,那么它应该将模型的数据链接到视图的数据。
所有与业务逻辑有关的计算都应该在控制器中完成。如果您决定遵循已建立的具有两个目的的视图控制器的模式,那么这将是您计算的地方。应始终在视图控制器中完成直接影响外观的计算(颜色,绘制的x
和y
值,宽度和高度值等)。
正如我之前所说,根据MVC模型,使用(或滥用)视图控制器(窗口控制器是视图控制器)作为控制器是相当普遍的。我决定采用这种方法,以便我可以轻松地整合来自tutoreals或Stack Overflow答案的代码片段。但最终,这取决于你。但是,当您拥有单视图应用程序时,使用窗口控制器仅是可取的。一旦开始使用导航视图控制器来推送视图,标签栏等,如果您没有使用专用控制器对象,则应该(ab)使用相关的UIViewController
子类。
答案 2 :(得分:1)
您可以将数据数组与计算代码放在一个类中:模型。然后,视图控制器将读取用户输入并将其放入此模型类中。这是一个很好的面向对象设计,可以很好地保持数据及其操作,同时保持完全不受UI相关代码的影响。
如果计算不会花费太多时间,您可以在主线程中执行它们,以便视图控制器调用模型方法,该方法返回结果。或者,根据数据的形状,模型可能会使结果与其他方法和/或属性一起使用。
如果计算可能需要更长时间,则应考虑使用GCD的dispatch_async()
在模型内的优先级较低的线程上运行它们。你不想长时间阻止用户界面 - 我会说,大约一秒就是限制。在这种情况下,最好在模型的计算方法中添加就绪块,以便模型可以在计算准备就绪时通知视图控制器。不要忘记在主线程上运行此块,以防止视图控制器中的UIKit操作混乱。 (如果您需要我上面提到的任何内容的详细信息或代码,请告诉我,但大多数内容应该很容易在Stack Overflow或其他地方找到。)
最后,包含表视图的NIB的单个视图控制器是可行的方法。您通常会在UIView
子视图中放置UI功能(例如图表),而不是在额外的UIViewController
中。然后,您可以将子视图放在NIB上(或以编程方式在视图控制器中添加)。