2011-06-13 51 views
14

有什么技术原因不能让单身人士班级来管理我的核心数据?我现在正在努力做出决定,如果我应该删除所有样板核心数据代码并以单身形式重新实现它。核心数据单身经理?

回答

14

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

但是,即使只适用于具有一个持久存储的简单应用程序,并且所有上下文都使用该一个存储。在更复杂的应用程序中,您可能有多个商店或上下文,因此单身人士很快变得太臃肿。

一个单例通常不会为你隐藏或保存重复编码带来很大的复杂性,因为大部分与核心数据有关的编码都在控制器层中,在此模型中将模型链接到视图/接口。由于该逻辑通常是针对每个视图定制的,因此您无法将其停放在单例中。

我过去使用过单身人士,但最终他们通常会证明比他们身价更麻烦。

15

有两个重要的考虑因素(注意:这些都不是只有两个)决定是否单身是适合你的时候:

  1. 线程
  2. 内存使用

线程

单身很方便,但如果你的应用程序使用多线程,你可能会试图写是这样的:

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

不久之后,你的应用程序会崩溃,因为你已经访问其很可能在主线程中创建一些其他线程managedObjectContext。

内存使用

单身永远不会消失,这是一个单身的地步。因此,他们也从不愿意释放他们所消耗的资源。就CoreData而言,这意味着托管对象上下文将继续在内存中保存托管对象,直到您调用-reset或-save :.

如果您的应用使用大量数据,那可能会很糟糕。

+0

你能解释一下关于线程问题的更多吗?我正在为聊天应用使用单身人士,并且在获取上下文时我的应用崩溃。 – OMGPOP 2014-01-06 16:42:33

+0

如何不能使用单例防止多线程问题?即使您传递上下文指针,仍然只有上下文的一个副本 – OMGPOP 2014-01-06 16:46:50

+0

它鼓励您为特定线程创建实例。如果你传递上下文指针,你创建了一个单例,不管它是否遵循这个模式。 – ImHuntingWabbits 2014-01-06 19:46:48