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 传递给视图控制器