NSManagedObjectContext 传递给 NSWindowController 变为 nil

Posted

技术标签:

【中文标题】NSManagedObjectContext 传递给 NSWindowController 变为 nil【英文标题】:NSManagedObjectContext passed to NSWindowController becoming nil 【发布时间】:2012-11-04 22:18:17 【问题描述】:

我真的很想弄清楚我的托管对象上下文消失在哪里。

我最初是在我的应用程序委托中实例化它,然后将其传递到 NSWindowController 中的保留属性中:

self.TPWC = [[TestPanelWindowController alloc] initWithWindowNibName:@"TestPanel"];
self.TPWC.managedObjectContext = self.managedObjectContext;
self.TPWC.persistentStoreCoordinator = self.persistentStoreCoordinator;
[TPWC.window makeKeyAndOrderFront:nil];

然后我有一个按钮,它应该实例化 NSManagedObject 并将其插入到托管对象上下文中,如下所示:

 NSManagedObject *newInstanceOfSomeEntity =

 [NSEntityDescription insertNewObjectForEntityForName:@"SomeEntity" 
 inManagedObjectContext:self.managedObjectContext];

此时,self.managedObjectContext 不知何故变成了 nil。

我已经在 windowDidLoad 中插入了一个断点,并且我可以确认,此时我们确实有一个有效的 NSManagedObjectContext 实例,但它在 viewDidLoad 和尝试插入托管对象之间不知何故变成了 nil。

我尝试创建一个自定义初始化程序来设置 NSManagedObjectContext,但它仍然为零。

Core Data 对我来说很新,我很难理解出了什么问题。

【问题讨论】:

你的财产是强财产吗? 您的@property managedObjectContext 是如何定义的? 是的,这是一个强大的属性。 id 在上下文中设置一个 WATCHpoint,以便您看到它何时被修改 【参考方案1】:

这不是您为什么看到您的上下文消失的直接答案,但它仍然可以解决您的问题:

从架构的角度来看,您确实不应该在对象之间传递托管对象上下文,尤其是 UI 对象。

相反,您应该有一个全局单例类来实例化托管对象上下文(可能还有协调器和持久存储),然后通过公共属性提供对它的访问。然后,从您的窗口控制器,您只需从单例对象访问它。

(如果您使用多线程,请注意从不同线程访问和使用相同的上下文。)

【讨论】:

你可以这么说。在 wwdc09 苹果有这样的例子:传递对象。 IMO 还不错,它使 VC 保持隔离和可重用 你是对的 - 它没有解释为什么我看到上下文消失但调用单例是实例中的有效解决方法,所以我会接受答案并将赏金视为最终解决方案确实解决了问题。

以上是关于NSManagedObjectContext 传递给 NSWindowController 变为 nil的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中

NSManagedObjectContext 传递给 NSWindowController 变为 nil

如何通过 Interface Builder 的 XIB 传递 NSManagedObjectContext

使用情节提要(iOS)时如何将 NSManagedObjectContext 传递给视图控制器

在嵌套的 NSManagedObjectContext 中缓慢删除和保存

将 NSManagedObjectContext 上下文传递给 ViewController 是 nil