我正在构建一个将使用Core Data模型的应用程序。我在Objective C上很新,我的常用设计模式并不适用于Core Data和Objective C,至少我似乎无法找到确认它们的例子。
我已经浏览过Apple Developer示例和intertubes上的不同来源。
似乎要利用Core Data我需要将managedObjectContext传递给我的每个viewControllers,让viewController实现NSFetchedResultsControllerDelegate,然后实现每个方法进行获取并随后实现
NSFetchedResultsChangeInsert
NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate
这会在每个viewController中添加大约100多行代码,并且它是我反复编写的相同代码的90%。另外,我必须传递一切并跟踪它的内存占用。
在其他语言中,我将构建一个包含几个类的单例模型,这些类包含根据请求维护和提供数据的方法,可以从任何地方获得。我似乎无法在Objective C中采用这种方法。如果我在哪里构建一个静态类,它接受了一个managedObjectContext并返回了我需要的东西,我仍然需要将managedObjectContext传递给每个视图,它不会是异步,就像我实现委托方法一样,只有在结果准备就绪时调用它。
我希望这是有道理的,而且有人可以确认没有其他合理的方法可以做到这一点,或者帮助我指明以良好的方式包装它的方向。
感谢:)
答案 0 :(得分:19)
核心数据并不像您描述的那么复杂。
通常,iPhone应用程序具有“主”托管对象上下文,通常由应用程序委托拥有。只要您可以获得应用程序委托(提示:[[UIApplication sharedApplication] delegate]
),您就可以访问托管对象上下文。我喜欢定义一个静态全局变量来保存对我的app委托的引用,以使生活更轻松。
NSFetchedResultsController
个实例与UITableView
个实例之间通常存在一对一的对应关系。除了填充表格视图外,您需要NSFetchedResultsController
的情况极为罕见。如果您有许多类似的视图(例如,标签栏可以让您以不同的方式查看iPod应用程序的相同数据),那么您应该创建一个配置NSFetchedResultsController
的基类并派生出来你的特定视图控制器。
现在,当您创建视图控制器以编辑对象时,通常最好在单独的托管对象上下文中执行此操作。如果用户取消,您只需丢弃上下文,更改就会消失。同样,您实际上并不需要NSFetchedResultsController
,因为这些视图仅涉及单个对象。
完成编辑后,您save:
托管对象上下文。管理其他托管对象上下文的对象应实现NSFetchedResultsControllerDelegate
方法以使表视图保持同步。同样,这可以在基类中实现,因此您可以为相关的视图控制器概括此功能。
答案 1 :(得分:0)
您是否必须使用CoreData模型,或使用NSCoder(NSArchiver,NSKeyedArchiver等)工作?我发现CoreData对于大多数应用来说都是过度的。
另外,你能澄清为什么你不能采用单身人士的方法吗?我在许多应用程序中使用了单件工厂而没有任何问题。定义在共享(单例)实例上运行的类级方法相当容易。