如何最好地构建基本iPhone表/导航数据库应用程序的代码?

时间:2010-06-24 02:45:01

标签: iphone objective-c

通过iPhone完成了一些基础知识的教程,我很难确定如何最好地构建我的代码。我正在使用的这本书指出了“你通常不会把它放在这里,但为了权宜之计......”。好吧,我想知道一个人“通常”会做什么。

我的应用程序有点简单 - 有一个表格视图显示对象列表,可以添加,删除,编辑这些对象(我计划稍后提供更复杂的组织方案,但我保持简单易行工作的东西)。

所以,我有RootViewController扩展UITableViewController。当单击“添加”按钮时,我将UIViewController的子类推入堆栈(此类是我的对象的“添加/编辑”表单)。我有一个简单的数据结构样式类来保存对象的字段。

本书中的这类应用程序基本上将一个数组放在RootViewController内,并使用对模型类的引用来表示“正在编辑的对象”。基本上,模型都包含在视图控制器中。这似乎不对。

所以,我的问题是:模型和管理它们的对象通常存在于哪里?

而且,答案是否取决于我如何存储我的物品?我没有对CoreData做过多少工作,尽管我的计划是将它用于持久化我的对象。 XCode提供的钩子和样板是否会使这个问题变得不合适?

最佳答案将指向一些最佳实践类型的内容,我无法通过Google或Apple的Dev网站轻松找到这些内容。

1 个答案:

答案 0 :(得分:2)

首先,你认为你的直觉似乎是错的。如您所述,模型存储在视图控制器中。这是个坏主意。这样做违反了模型 - 视图 - 控制器范例,这使得代码难以维护。

所以你现在需要做的是将你的模型放在一个单独的对象或对象树中,甚至更好地使用CoreData,这在内存管理方面也很棒。

如果您想使用CoreData,您应该查看UIFetchedResultsController类,您将使用该类从managedObjectContext获取对象,该对象将是您的模型。

您将在表格视图中执行的操作 - 详细信息编辑示例为:

  1. 使用获取请求获取表视图的内容,并在您在rootViewController中作为实例变量保存的NSFetchedResultsController上设置它
  2. 将此rootViewController设置为该NSFetchedResultsController
  3. 的委托
  4. 如果选中某个项目或按下添加按钮,则按下堆栈上的详细视图控制器,使用它传递要编辑的对象,如果是新对象则传递nil。还将managedObjectContext传递给detailViewController。更新或创建对象。
  5. 在rootViewController中实现NSFetchedResultsController的委托方法,然后在必要时重新加载表的内容。
  6. 您获得的是模型(CoreData的managedObjectContext)与控制器(rootViewController和detailViewController)的完美分离和您的视图。如果现在使用详细视图编辑条目,则会通过NSFetchedResultsController通知rootViewController并自动更新。您还获得的是您在应用程序中的viewControllers中没有强引用。

    顺便说一句,您在应用程序的委托中设置了CoreData内容。在Xcode和ADC上有很多样板代码。查看Recipies app [1],其中使用了我刚刚描述的这种方法。 Apple的开发者网站上也有一些关于CoreData的视频。

    [1]:http://developer.apple.com/iphone/library/samplecode/iPhoneCoreDataRecipes/Introduction/Intro.html CoreDataRecipies