NSDocument 唯一标识符
Posted
技术标签:
【中文标题】NSDocument 唯一标识符【英文标题】:NSDocument unique identifier 【发布时间】:2017-01-18 03:14:36 【问题描述】:问:有没有什么方法可以在基于 Document™ 的应用程序中获取唯一的 NSDocument 标识符,它在应用程序重启期间是持久的?
注意 1:肯定应该有某种 id,而不仅仅是 fileURL,而是其他的,因为应用程序适用于自动保存甚至尚未保存的文档。
注意 2:出于某些原因,我不想生成此 id 并将其保存到文档的内容文件中。
【问题讨论】:
您的文档是单个文件还是一个包?它有存储元数据的地方吗? @MichaelDautermann 这是一个纯文本文件。 相关问题:NSFileSystemFileNumber is changed after file is edited/updated in objective c 【参考方案1】:即使我没有尝试过,我认为扩展属性也可以完成这项工作:
uuid_t uuid;
[[NSUUID new] getUUIDBytes:uuid];
int result = setxattr( path, "com.yourcompany.yourapp.yourattr", &uuid, sizeof(uuid), 0, 0);
由于扩展属性既不是文件本身的一部分,也不是所有文件系统的标准,当文件被复制到不支持此类属性的文件系统的存储上时,它们可能会丢失。
【讨论】:
【参考方案2】:我最终在一个方法中将数据保存到 coder
encodeRestorableStateWithCoder
在文档关闭期间并在重新打开文档时恢复 restoreDocumentWindowWithIdentifier
中的数据。
- (void) encodeRestorableStateWithCoder: (NSCoder *) coder
[super encodeRestorableStateWithCoder: coder];
[coder encodeObject: @@"color":@"red" forKey: @"OBJECT_KEY"];
- (void) restoreDocumentWindowWithIdentifier: (NSString *) identifier
state: (NSCoder *) state
completionHandler: (void (^) (NSWindow *, NSError *)) completionHandler
NSDictionary * restoredInfo = [state decodeObjectForKey: @"OBJECT_KEY"];
[super restoreDocumentWindowWithIdentifier: identifier state: state completionHandler: completionHandler];
我认为可以将生成的 UID 保存在那里,但这种存储可能不是很可靠。
【讨论】:
以上是关于NSDocument 唯一标识符的主要内容,如果未能解决你的问题,请参考以下文章