2011-09-20 107 views
0

我正在研究一个具有多个视图控制器的应用程序,用于不同的屏幕,整个应用程序是关于显示来自sqlite数据库的数据。管理模型和多个视图控制器的单个控制器?

我的正式设计是有一个数据库对象(模型),一个独占访问这个模型的主控制器,并让所有其他视图控制器只管理窗口,按钮,whathaveyou的视觉方面。

但是我很难实现如何让主控制器在苹果的ios应用程序体系结构的整个应用程序生命周期内意识到所有其他视图控制器。

到目前为止,我已经想到了3种方法: 1 - NSNotificationCenter并让主控制器观察所有其他控制器? 2 - 让所有其他人的主控制员代表?虽然我仍然不清楚如何定义一个委托(一般我会说这个词?)协议。也就是说,即使对于没有setDelegate方法的对象也是如此。 3 - 将db对象传递给每个视图控制器。虽然这看起来有点像打C传球状态..

有什么想法? 谢谢!

回答

1

您的方法应该可能是视图控制器和模型尽可能无知的地方。我相信这是一种很常见的设计模式。您应该有代表您的域中每个逻辑“对象”的模型对象。这些对象可能只是状态。接下来,您可能需要创建一个可以访问数据库并可以进行查询的控制器(就像您提到的那样)。这些查询的结果应该用来构建逻辑模型对象(例如XXPerson)的实例,并将它们交给做出查询的任何事物。鉴于此,在您的应用程序的每个视图控制器应该做到以下几点:

  1. 创建自己的观点,并布置它们适当
  2. 实例化数据库控制器对象(也可能抓住它进一步使用)
  3. 查询数据库中它通过数据库控制器对象
  4. 使用所产生的数据(应该返回你的逻辑模型对象)来调整观点或做任何你需要与他们所需要的数据

请注意,您可以使用为您的数据库控制器使用单例,但如果您询问最优秀的开发人员,单例模式是令人讨厌的。 :)相反,你的应用程序不能仅仅根据需要创建数据库控制器的实例,而是为了某些查询而使用它,然后放弃它。

在内部,当然,您的数据库控制器类应该对数据库有单独的静态访问,并且可能会同步对写入方法的访问,以避免遇到并发问题。

有许多可能的设计方法,但其中的东西是松散耦合意味着没有大量的相互依赖关系正在进行,这总是一件好事。让你的模型对象,数据库控制器对象和视图都是相互独立的。当然,视图控制器是将所有这些独立概念组合成功能性产品的桥梁。

这是我的意见,无论如何。:)

+0

同意,请记住,您的控制器代码通常是您的应用程序中可重复使用程度最低的部分。 –

0

这听起来像你正在寻找一个数据访问对象或服务/商店作为你的控制器层的一部分。我认为这是一个好主意和其他语言的常见模式,出于某种原因在iOS应用程序中似乎被广泛忽视。

为您的每个视图控制器提供一些管理对数据存储的访问的对象。您可能只想构建该商店的单个实例,但您的控制器不需要知道该实例。就任何单个控制器而言,它都有一个可以用来获取和存储模型对象的对象。

我不认为你应该尝试阻止你的视图控制器访问模型对象。而是引入一个服务,以便您的视图控制器不需要知道如何加载或保留这些模型对象的细节。如果需要,您可以使用该服务在一个模型与另一个模型之间进行转换,如果您发现需要视图模型或不希望视图控制器直接与您持续存在的任何模型对象一起工作。

我认为像这样的依赖应该是强引用而不是委托,并且当它们通过基于构造函数或基于属性的依赖注入或控制容器的一些反转构建时提供给每个视图控制器应用程序。