-makeWindowControllers是初始化NSPersistentDocument的最佳位置吗?

pau*_*kow 1 cocoa core-data nspersistentdocument

在使用加载现有文档时NSPersistentDocument,作为初始化的一部分,我想准备一些内容:

    NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"DocumentRoot"];
    NSArray *results = [self.managedObjectContext executeFetchRequest:req error:NULL];
    if (results.count) self._docRoot = [results objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

当我将此代码放入时-init,提取请求不会返回任何结果。

在将视图控制器组件从我的NSPersistentDocument子类重构到新的NSWindowController子类时遇到了这个问题。我曾经在中处理过这种初始化-windowControllerDidLoadNib:,但是现在不再调用了。

如果将代码从-init移到,-makeWindowControllers我会得到预期的结果。是否-makeWindowControllers真的准备这样的内容的权利的地方吗?

pau*_*kow 5

根据我得到的答复,我认为我做对了,所以这是我对自己问题的回答。

如果您使用的是NSPersistentDocument提供的Core Data堆栈,则不能使用中的Core Data -init

相反,您应该:

  1. 将文档初始化代码直接放在-windowControllerDidLoadNib:–中,或者如果使用自定义NSWindowController子类,则放在中-makeWindowControllers
  2. 您也可以将文档初始化代码抽象为具有一些唯一名称(如)的帮助器方法-setUpDocument,然后从-makeWindowControllers/ 调用该方法-windowControllerDidLoadNib:

如果您使用的是普通的NSDocument,或者您自己设置了Core Data堆栈,则可以在中设置文档模型-init