问题描述
|
有什么技术原因不让单例课程管理我的核心数据?如果要删除所有样板代码核心数据代码并在一个实例中重新实现,我现在正在尝试做出决定。
解决方法
Xcode模板中应用程序委托中的样板代码在功能上实现为单例。该应用程序对象是一个单例对象,并且仅维护一个委托对象,因此您只有一个Core Data堆栈实例,并且由于该应用程序对象是可普遍访问的,因此您也始终可以获取该应用程序委托。
但是,即使这样也仅适用于具有一个永久性存储的简单应用程序,并且所有上下文都使用该一个存储。在更复杂的应用中,您可能拥有多个商店或上下文,因此单身人士很快就会变得too肿。
单例通常不会给您带来太多隐藏或保存重复编码的麻烦,因为您与Core Data所做的大部分编码都在控制器层中,您可以在其中将模型链接到视图/界面。由于该逻辑通常是针对每个视图定制的,因此您实际上无法将其停在单例中。
过去我曾经使用过单例,但最后它们通常比其价值更麻烦。
, 在确定单身人士是否适合您时,有两个重要的注意事项(请注意,这不是唯一的两个):
穿线
内存使用情况
穿线
单例很方便,但是如果您的应用程序使用多个线程,您可能会想编写如下代码:
[[CDSingleton managedObjectContext] executeFetchRequest:someFetch];
//later on a background thread you might write
NSManagedObject *object = [[CDSingleton managedObjectContext] objectWithID:objectID];
在那之后不久,您的应用程序将崩溃,因为您已经访问了ManagedObjectContext,该对象很可能是从其他线程在主线程上创建的。
内存使用情况
单例永远不会消失,这就是单例的意义。因此,他们也从不乐意释放其消耗的资源。对于CoreData,这意味着托管对象上下文将继续在内存中保存托管对象,直到您调用-reset或-save:为止。
如果您的应用程序使用大量数据,那可能会很糟糕。
, 最佳实践是在视图控制器之间传递托管对象上下文。 Apple文档和示例可以做到这一点。您绝对不必真正访问应用程序委托,而不是访问Core Data,而不是任何东西。
http://www.cimgf.com/2011/01/07/passing-around-a-nsmanagedobjectcontext-on-the-iphone/