gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:42 24 4
gpt4 key购买 nike

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

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

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

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

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

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

感谢任何反馈

最佳答案

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

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

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

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

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

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

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

关于iphone - 使用#DEFINE 共享托管对象上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com