目标c-核心数据单例管理器



有什么技术原因不制作一个单独的类来管理我的核心数据?我现在正试图做出一个决定,是否应该去掉所有的样板核心数据代码,并在单例中重新实现它。

Xcode模板中应用程序委托中的样板代码在功能上实现为单例。应用程序对象是一个单例,它只维护一个委托对象,因此您只有一个核心数据堆栈实例,并且由于应用程序对象可以通用访问,因此您也可以访问应用程序委托。

然而,即使这样,也只适用于具有一个持久存储的简单应用程序,所有上下文都使用该存储。在更复杂的应用程序中,您可能有多个存储或上下文,因此单例很快就会变得过于臃肿。

单例通常不会为隐藏或保存重复编码带来太多复杂性,因为与核心数据相关的大多数编码都在控制器层中,在那里可以将模型链接到视图/接口。由于该逻辑通常是针对每个视图自定义的,因此实际上不能将其放置在singleton中。

我过去也用过单身汉,但最终他们通常会被证明比他们的价值更麻烦。

在决定单例是否适合您时,有两个重要的考虑因素(请注意,这不是唯一的两个):

  1. 线程
  2. 内存使用情况

线程

单线程很方便,但如果你的应用程序使用多个线程,你可能会想写这样的东西:

[[CDSingleton managedObjectContext] executeFetchRequest:someFetch];
//later on a background thread you might write
NSManagedObject *object = [[CDSingleton managedObjectContext] objectWithID:objectID];

之后不久,您的应用程序将崩溃,因为您访问了一个managedObjectContext,该上下文很可能是从其他线程在主线程上创建的。

内存使用

单身汉永远不会离开,这就是单身汉的意义所在。因此,他们也从不愿意释放他们消耗的资源。在CoreData的情况下,这意味着托管对象上下文将继续在内存中保存托管对象,直到您调用-reset或-save:。

如果你的应用程序使用了大量数据,那可能会很糟糕。

最佳实践是在视图控制器之间传递托管对象上下文。苹果的文档和样本就是这样做的。你永远不应该真正访问你的应用程序代理,不是为了核心数据,也不是为了任何事情。

http://www.cimgf.com/2011/01/07/passing-around-a-nsmanagedobjectcontext-on-the-iphone/