视图初始化时无法访问托管对象上下文

Posted

技术标签:

【中文标题】视图初始化时无法访问托管对象上下文【英文标题】:Can't access managed object context when view is initializing 【发布时间】:2011-08-25 14:56:40 【问题描述】:

我正在使用具有以下配置的 MainWindow.xib 文件:

MainWindow.xib

UITabBar 控制器 UINavigationBarController UITableViewControllerAlpha UINavigationBarController UITableViewControllerBeta UINavigationBarController UITableViewController查理

但基于以下帖子: Why does Core Data initialization fail when I attempt to do it at these points? 以及我放置的断点,我得出的结论是 initWithCoder 被用于初始化所有 UITableViewControllers,并且在应用程序生命周期的那个时刻没有办法可靠地使用 managedObjectContext。

那么这是否意味着我必须放弃我在 MainWindow.xib 中执行的所有“简单”设计工作和布局并以编程方式进行?使用核心数据真的意味着不能使用 NIB 文件吗?还是有一些中间立场?

请告诉我,谢谢!

【问题讨论】:

【参考方案1】:

同时使用 Core Data、表视图和 NIB 没有问题。我认为您需要从 MOC 中为您的表视图获取一些对象,而当您需要这样做时,您在查找 MOC 时遇到了问题。

这种方法对我有用:

将 nib 定义为目标的主界面。 在 nib 中加载导航控制器和根视图控制器。 在applicationDidFinishLaunching: 中设置根视图控制器的managedObjectContext 属性 在根视图控制器的viewDidLoad 中从 MOC 获取

所以,先试试这个:

让应用委托在applicationDidFinishLaunching: 中设置控制器的managedObjectContext 在viewDidLoad 而不是initWithCoder 中进行提取。

如果这不起作用,您至少还有以下选择:

    applicationDidFinishLaunching: 中设置控制器的managedObjectContext,但在调用数据源方法之前不要获取数据。在这些方法中,如果尚未完成提取,则有条件地完成提取。

    在你的控制器上写一个类似loadDataFromMOC:的方法,它既设置MOC又从中获取,并从applicationDidFinishLaunching:调用它。

【讨论】:

以上是关于视图初始化时无法访问托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa 无法在没有托管对象上下文的情况下执行操作

尝试访问托管对象属性时的 EXC_BAD_ACCESS

GraphQL 订阅字段无法访问解析器的上下文

在主线程中非法访问托管对象上下文,为啥?

服务器主体无法访问 SQL Server MS 2012 中当前安全上下文下的数据库

其他线程可以间接访问在自己的线程中运行的托管对象上下文吗?