从 NSObject 获取 NSDocument

Posted

技术标签:

【中文标题】从 NSObject 获取 NSDocument【英文标题】:Get NSDocument from NSObject 【发布时间】:2021-01-13 11:16:53 【问题描述】:

我使用的是 macOS,objective-c,而不是 ios。 我目前正在重写我的应用程序以基于文档。我现在将每个 NSDocument 文件中需要的数据保存为属性,该属性很好用,包括自动保存。

我可以通过 NSViewControllers 访问该数据

self.view.window.document.mydata

我也可以通过

访问数据
[[NSDocumentController sharedDocumentController] currentDocument].mydata

但正如文档对上述方法所说的那样

如果在应用未激活时调用此属性,则该属性的值为 nil。

我的问题是我在文档中有(大量)自定义 NSObject 来处理内容并需要访问该数据。这也发生在后台(使用计时器)。如果应用程序在后台并且没有可用的窗口,那么从 NSObject 访问文档的最佳方式是什么?

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

【问题讨论】:

我认为如果您开发扩展程序,您也会遇到同样的问题,例如快速查看您需要在没有正确文档的情况下访问文档数据的位置。由于您只是在查找数据而不是在完整文档中获得的所有功能,因此您可能需要去除数据的序列化和反序列化,以便您可以在文档内部和文档外部进行操作需要偷看一些东西。 你能举个例子吗? 【参考方案1】:

(基于 cmets)这里是一个例子。尽管适用于 iOS。文档本身由存储在多个文件中的大量互连对象组成。在 UIDocument 内部存储文档数据时,我创建一个摘要并将其存储在名为 sum 的单独文件(文档内部)中。

在其他地方我需要提供有关文档的一些信息,但我不需要恢复整个文档或启动所有对象并链接和运行。我只需要从摘要文件中读取。这实际上是第二次迭代,之前我确实恢复了它,但通过在保存文档时创建此摘要来简化它。

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

总之,这就是那段代码。

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

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

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

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

【讨论】:

以上是关于从 NSObject 获取 NSDocument的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器

没有在 NSObject 类 ios swift 中获取委托方法的回调

将 ManagedObject 转换为 NSObject

如何获取 NSObject 的引用计数?

将提要流项目 NSObject 存储在磁盘中或作为 JSON

Swift Simulator 文件夹位置