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

时间:2012-06-06 22:18:49

标签: iphone objective-c ios nsmanagedobjectcontext

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

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

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

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

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

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

感谢您的反馈

2 个答案:

答案 0 :(得分:2)

而不是编译器宏(有时会引起意外)我通常在我的app委托上定义一个类方法,如下所示:

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

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

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

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

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

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

答案 1 :(得分:0)

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