Get NSDocument from NSObject



我使用的是macOS、objective-c,而不是iOS。我目前正在重新编写基于文档的应用程序。现在,我将每个NSDocument文件中重复使用的数据保存为属性,该属性非常有效,包括自动保存。

我可以通过从NSViewControllers访问这些数据

self.view.window.document.mydata

我也可以通过访问数据

[[NSDocumentController sharedDocumentController] currentDocument].mydata

但正如文件对上面的方法所说的那样

如果在应用程序不活动时调用此属性,则此属性的值为零。

我的问题是,我在一个文档中有(大量(自定义的NSObjects,它们处理一些东西并需要访问这些数据。这种情况也发生在后台(使用计时器(。如果应用程序在后台且没有可用窗口,那么从NSObject访问文档的最佳方式是什么?

我需要在创建时将文档传递给每个对象吗?这感觉不正确。

(基于注释(下面是一个示例。尽管适用于iOS。文档本身由存储在多个文件中的大量互连对象组成。在UIDocument中,当存储文档数据时,我会创建一个摘要,并将其存储在一个名为sum的单独文件中。

在其他地方,我需要在文档上提供一些信息,但我不需要恢复整个文档,也不需要启动、链接和运行所有对象。我只需要阅读摘要文件。事实上,这是第二次迭代,之前我确实恢复了它,但通过在保存文档时创建这个摘要,简化了它很多。

也就是说,也许您可以使用这样一个摘要来存储在NSDocument之外访问文档数据时所需的基本内容?

不管怎样,这就是代码。

NSDictionary < NSString *, NSFileWrapper * > * fDic = self.wrapper.fileWrappers;
NSFileWrapper * sumWrapper = [fDic objectForKey:@"sum"];

这与UIDocument文件加载和保存挂钩内部发生的情况非常相似,与NSDocument的情况类似。

无论如何,一旦我有了sumWrapper,我就可以从中提取我需要的内容,而不必恢复完整的文档。但是,即使我需要完整的文档,我也可以恢复字典中的所有文件包装器,并像在文档中一样使用它们。

我希望这能有所帮助。文档可以包含任何内容。在我的例子中,它是相当细粒度的,分布在很多文件中,这使得只访问文档的一部分变得很容易。如果您将所有对象存储在一个文件中,那么除非您将所有这些功能移动到一个单独的支持类中,然后您可以在NSDocument内部和外部使用该支持类,否则这将更加困难。

最新更新