使用 #DEFINE 共享托管对象上下文



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

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

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

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

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

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

感谢您的任何反馈

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

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

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

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

如果你的应用足够复杂,则可能需要麻烦传递对托管对象上下文的引用,而不是使用全局上下文。如果这样做,以后重构和使用其他技术(例如子上下文)对更改进行分组会变得更加容易。

具体来说,这意味着每个视图控制器都有自己的 managedObjectContext 实例变量。当您呈现新的视图控制器时,您会传递一个引用:也许在自定义 init 方法中,也许通过设置属性。您的任何类(根视图控制器除外)都不会引用您的全局应用程序委托。这样,如果您有一个复杂的编辑视图,您可以为其提供一个子上下文,它可以在其中"临时"保存更改(以验证所有对象是否有效);如果用户点击"取消"按钮,您只需丢弃整个上下文。

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

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

最新更新