核心数据单身经理?

时间:2011-06-13 20:11:43

标签: objective-c design-patterns core-data

有哪些技术原因没有使用单例类来管理我的核心数据?我现在正在尝试做出决定,如果我应该删除所有样板核心数据代码并在单例中重新实现它。

3 个答案:

答案 0 :(得分:15)

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

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

单身通常不会为隐藏或保存重复编码带来太多复杂性,因为与Core Data有关的大部分编码都在控制器层中,您可以将模型链接到视图/接口。由于该逻辑通常是每个视图的自定义,因此您无法将其实际存放在单例中。

我过去曾使用过单身人士,但最后他们通常比他们的价值更麻烦。

答案 1 :(得分:15)

在决定单身人士是否适合你时,有两个重要的考虑因素(注意这些不是唯一的两个):

  1. 线程
  2. 内存使用
  3. <强>线程

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

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

    在此之后不久,您的应用程序将崩溃,因为您访问了可能在其他线程的主线程上创建的managedObjectContext。

    内存使用

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

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

答案 2 :(得分:2)

最佳做法是在视图控制器之间传递托管对象上下文。 Apple文档和示例就是这样做的。您永远不应该真正访问您的应用程序代理,而不是Core Data,而不是任何内容。

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