通过iPhone完成了一些基础知识的教程,我很难确定如何最好地构建我的代码。我正在使用的这本书指出了“你通常不会把它放在这里,但为了权宜之计......”。好吧,我想知道一个人“通常”会做什么。
我的应用程序有点简单 - 有一个表格视图显示对象列表,可以添加,删除,编辑这些对象(我计划稍后提供更复杂的组织方案,但我保持简单易行工作的东西)。
所以,我有RootViewController
扩展UITableViewController
。当单击“添加”按钮时,我将UIViewController
的子类推入堆栈(此类是我的对象的“添加/编辑”表单)。我有一个简单的数据结构样式类来保存对象的字段。
本书中的这类应用程序基本上将一个数组放在RootViewController
内,并使用对模型类的引用来表示“正在编辑的对象”。基本上,模型都包含在视图控制器中。这似乎不对。
所以,我的问题是:模型和管理它们的对象通常存在于哪里?
而且,答案是否取决于我如何存储我的物品?我没有对CoreData做过多少工作,尽管我的计划是将它用于持久化我的对象。 XCode提供的钩子和样板是否会使这个问题变得不合适?
最佳答案将指向一些最佳实践类型的内容,我无法通过Google或Apple的Dev网站轻松找到这些内容。
答案 0 :(得分:2)
首先,你认为你的直觉似乎是错的。如您所述,模型存储在视图控制器中。这是个坏主意。这样做违反了模型 - 视图 - 控制器范例,这使得代码难以维护。
所以你现在需要做的是将你的模型放在一个单独的对象或对象树中,甚至更好地使用CoreData,这在内存管理方面也很棒。
如果您想使用CoreData,您应该查看UIFetchedResultsController类,您将使用该类从managedObjectContext获取对象,该对象将是您的模型。
您将在表格视图中执行的操作 - 详细信息编辑示例为:
您获得的是模型(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