2

只是寻找一些关于这是否是共享托管对象上下文的坏主意的反馈。

MyApp-Prefix.pch文件中,我添加了以下内容:

#import "AppDelegate.h"
#define MOC [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]

然后,当我需要访问上下文时,我会执行以下操作(只是一个示例):

[MOC deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

这似乎工作得很好,但似乎也太容易了,特别是因为我没有看到任何地方提到它。这是一个糟糕的设计模式吗?

感谢您的任何反馈

4

2 回答 2

2

我通常在我的应用程序委托上定义一个类方法,而不是编译器宏(有时会导致意外),如下所示:

+ (AppDelegate *)sharedDelegate
{
    return [[UIApplication sharedApplication] delegate];
}

然后,当我需要引用某个全局状态时,我可以这样称呼它:

[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo];

如果您的应用程序足够复杂,那么传递对托管对象上下文的引用而不是使用全局引用可能是值得的。如果这样做,以后重构和使用其他技术会变得更容易,例如子上下文对更改进行分组。

具体来说,这意味着每个视图控制器都有自己的 managedObjectContext 实例变量。当你展示一个新的视图控制器时,你传递了一个引用:可能是在一个自定义的 init 方法中,也可能是通过设置一个属性。您的所有类(可能除了根视图控制器)都没有引用您的全局应用程序委托。这样,如果您有一个复杂的编辑视图,您可以给它一个子上下文,它可以“临时”保存更改(以验证所有对象是否有效);如果用户点击取消按钮,您只需将整个上下文扔掉。

此外,如果您总是使用全局上下文,您可能会遇到难以追踪的错误。例如,一个在自身之后没有清理的编辑视图会留下一个无效的对象。然后下次你去保存不相关的东西时,你会得到一个错误!发生在我身上,调试起来并不有趣。

于 2012-06-06T22:25:31.787 回答
0

这种方法没有错——但除非委托的托管对象上下文在程序的生命周期内发生变化,否则使用全局变量似乎更明智和有效。Cocoa AppKit 框架采用第二种方法,将 NSApp 变量设置为[NSApplication sharedApplication].

于 2012-06-06T22:24:06.623 回答