我正在尝试将一个 plist 和几个二进制文件(比如说图像)存储为 UIManagedDocument 的一部分。二进制文件的名称是 Core Data 中的一个属性,我不需要枚举它们,只需在显示相关实体时访问正确的名称即可。
我想要的文件结构是:
- <File yyyyMMdd-HHmmss>.extdoc
- StoreContent
- persistentStore
- AdditionalContent
- ListStatus.plist (used to store per document defaults)
- Images
- uuid1.png
- uuid2.png
- ...
- uuidn.png
到目前为止,我已成功按照如何将其他内容保存到我的 UIManagedDocument 文件包中的说明进行操作?,但是当我尝试添加二进制文件时,有些事情我不知道该怎么做。
- 我是否应该将 URL /the/path/File yyyyMMdd-HHmmss.extdoc/ AdditionalContent(readAdditionalContentFromURL:error: 提供的默认内容)视为 NSFileWrapper?与仅使用 URL 相比,有什么优点/缺点吗?我发现使用文件包装器更复杂,因为必须使用文件包装器访问器和 NSCoder(我猜)和文件来读取 plist,我必须存储图像目录的文件包装器,然后获取相应的带有 objectForKey 的节点(我假设)。但 Apple 的 iOS 文档基于文档的应用程序编程指南关于自定义格式而不是 NSData 或 NSFileWrapper 指出“请记住,您的代码将不得不复制 UIDocument 为您所做的工作,因此您必须处理更大的复杂性和更大的错误可能性。“我是不是误会了?
- 每个文档的默认值被声明为属性:setter 修改映射 plist 的 NSDictionary 并将文档标记为已更新,getter 使用正确的键访问字典。如何公开读取/写入二进制文件的能力?我应该向 UIManagedDocument 的子类添加方法吗?- (void)writeImage:(NSString*)uuid; 和 -(UIImage *)readImage:(NSString *)uuid; 我是否应该将这些数据保存在内存中,直到文档被保存?如何?
- 假设 NSFileWrapper 是要走的路,如果我打算将此文档与 iCloud 一起使用,我应该将文件协调器与文件包装器一起使用吗?如果是这样,怎么做?
每个问题的任何源代码将不胜感激。谢谢你。
PS:我知道我可以在 Core Data 中保存一些二进制数据,但我对那个解决方案感到不舒服。除其他原因外,如果我想创建桌面应用程序,我宁愿将 PNG 数据存储为 UIImage 的序列化版本与 NSImage 不兼容的图像文件。