NSDocument 唯一标识符
NSDocument unique identifier
问:有没有什么方法可以获取 Document-based™ 应用程序中 NSDocument 的唯一 标识符,它在应用程序重新启动期间是持久的?
注意 1:绝对应该有某种 id,它不仅仅是 fileURL,还有其他东西,因为应用程序可以很好地处理自动保存的甚至尚未保存的文档。
注意 2:出于某些原因,我不想生成此 ID 并将其保存到文档的内容文件中。
虽然我没有尝试过,但我认为扩展属性可以完成这项工作:
uuid_t uuid;
[[NSUUID new] getUUIDBytes:uuid];
int result = setxattr( path, "com.yourcompany.yourapp.yourattr", &uuid, sizeof(uuid), 0, 0);
由于扩展属性既不是文件本身的一部分,也不是所有文件系统的标准,因此当使用不支持此类属性的文件系统将文件复制到存储时,它们可能会丢失。
我最终在一个方法中将数据保存到 coder
encodeRestorableStateWithCoder
during document closing and restoring that data in 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 保存在那里,但这种存储可能不是很可靠。
问:有没有什么方法可以获取 Document-based™ 应用程序中 NSDocument 的唯一 标识符,它在应用程序重新启动期间是持久的?
注意 1:绝对应该有某种 id,它不仅仅是 fileURL,还有其他东西,因为应用程序可以很好地处理自动保存的甚至尚未保存的文档。
注意 2:出于某些原因,我不想生成此 ID 并将其保存到文档的内容文件中。
虽然我没有尝试过,但我认为扩展属性可以完成这项工作:
uuid_t uuid;
[[NSUUID new] getUUIDBytes:uuid];
int result = setxattr( path, "com.yourcompany.yourapp.yourattr", &uuid, sizeof(uuid), 0, 0);
由于扩展属性既不是文件本身的一部分,也不是所有文件系统的标准,因此当使用不支持此类属性的文件系统将文件复制到存储时,它们可能会丢失。
我最终在一个方法中将数据保存到 coder
encodeRestorableStateWithCoder
during document closing and restoring that data in 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 保存在那里,但这种存储可能不是很可靠。