根据MVC从什么地方评估数据库

时间:2015-04-08 09:34:15

标签: ios objective-c design-patterns model-view-controller model

我有一个问题需要了解如何根据我的应用程序中的MVC架构将数据从数据库正确下载到我的模型对象。

以下是该应用的外观:

                 / NavigationController -> ViewController -> ...
TabBarController - NavigationController -> ViewController -> ...
                 \ NavigationController -> ViewController -> ...

所以TabBarController是带有3个标签的初始控制器。在每个标签下,UIViewController中嵌入了NavigationController链。由特定UIViewController控制的每个视图都显示来自数据库的数据。这些数据经常更新,所以我需要定期从数据库下载它们。

然后我有一个模型对象。在我的应用程序中,我只有这一个模型对象,因此所有UIViewController都可以访问相同的模型对象(我知道每个UIViewController应该有自己的模型对象,但我有理由这样做) 。

据我了解MVC,沟通应该是这样的:

  • 当必须更新View时,UIViewController会向模型对象发送数据请求
  • 模型对象从源
  • 获取数据
  • 更新数据时,模型对象将信息发送到UIViewController
  • UIViewController将数据从模型对象更新为View

这应该没问题。但我不知道应该在哪里放置一个连接到数据库并向其发送请求的DatabaseController。这应该是分离的控制器和模型对象必须有一个引用它,因为他需要告诉他,他需要更新其数据。

我找到了一些博客,其中包含应在模型对象中创建DatabaseController并使用类别与模型对象代码分开的信息。我的观点是,这是一个坏主意,因为它破坏了MVC架构。

你怎么看?将DatabaseController放入应用程序的最佳解决方案是什么?我应该把它放在对象模型中还是外面......

3 个答案:

答案 0 :(得分:1)

我以前从未使用过Objective-C,但一般来说OOP,访问数据库的代码肯定应放在一个单独的地方 - 除此之外,这使得维护和修改变得更容易将来访问数据库的代码,并使代码更加清晰。

一种众所周知且广泛使用的方法是Data Access Object (DAO)模式,它允许您从其余逻辑中抽象出应用程序的持久性详细信息。
Repository模式也经常用于此目的。

在您的情况下,如果您有一个名为Thing模型类,则可以使用ThingDAO等方法创建getAllThings()getThingById(id)updateThing(thing)deleteThing(id)等 然后,您可以从Controller调用此对象,或者在我看来,更好地从您的模型类调用此对象。


您可能会认为,当我们添加另一个图层时," 会破坏MVC架构" - 在我看来,实际上DAO层是模型的一部分。我认为你的模型的概念可能不太正确 - 请记住,模型不是一个类,而是一组(可能是数千个)类。在一个大型应用程序中,您的模型将包含实体,DAO,EventListeners,处理程序,管理器,命令,变形金刚,助手等许多其他内容......

答案 1 :(得分:0)

数据访问等等,就像业务逻辑应该是模型的一部分,我将尝试解释原因:

  • 将越来越多的应用程序逻辑放入模型组件导致胖模型,瘦控制器范例
  • 胖模型,瘦的范例导致单元可测试代码,因为控制器不适合单元测试
  • 这种方法也提高了组件的可重用性,因为你不太可能重用控制器(大多数控制器都是以应用为目标的)

当然这适用于MVC,但是由于这种模式在iOS开发中被大量使用,因此主要关注它是有意义的。

答案 2 :(得分:-1)

我的建议是转向MVOC架构,其中O代表其他人。其他人将是一个不适合M,V或C的图层。这里的O将是您的网络层。控制器调用的单例对象,用于获取数据并获取填充的模型对象。