只是寻找一些关于共享托管对象上下文是否是一个坏主意的反馈。
在MyApp-Prefix.pch
文件中,我添加了以下内容:
#import "AppDelegate.h"
#define MOC [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]
然后,当我需要访问上下文时,我会执行以下操作(仅作为示例):
[MOC deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
这似乎很有效,但它似乎也太容易了,特别是因为我没有看到它在任何地方提到过。这是一个糟糕的设计模式吗?
感谢您的反馈
答案 0 :(得分:2)
而不是编译器宏(有时会引起意外)我通常在我的app委托上定义一个类方法,如下所示:
+ (AppDelegate *)sharedDelegate
{
return [[UIApplication sharedApplication] delegate];
}
然后,当我需要对某个全局状态的引用时,我可以这样称呼它:
[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo];
如果您的应用程序足够复杂,那么传递对托管对象上下文的引用可能是值得的,而不是使用全局的。如果这样做,以后可以更容易地重构和使用其他技术,例如子上下文来对更改进行分组。
具体来说,这意味着每个视图控制器都有自己的managedObjectContext实例变量。当您呈现一个新的视图控制器时,您传递一个引用:可能在自定义init方法中,可能通过设置属性。您的所有类(除了根视图控制器之外)都没有引用您的全局应用程序委托。这样,如果你有一个复杂的编辑视图,你可以给它一个子上下文,它可以“临时”保存更改(以验证所有对象是否有效);如果用户点击取消按钮,你只需抛弃整个背景。
此外,如果您总是使用全局上下文,则可能存在难以追踪的错误。例如,在自身之后不清理的编辑视图会留下无效对象。然后,下次你去保存不相关的东西时,你会收到错误!发生在我身上,调试并不好玩。
答案 1 :(得分:0)
该方法没有错 - 但除非委托的托管对象上下文在程序生命周期中发生变化,否则使用全局变量似乎更明智和有效。 Cocoa AppKit框架使用NSApp变量采用第二种方法,该变量设置为[NSApplication sharedApplication]
。