我有一个类,我希望能够打开该类并将其导出到文件。它不需要编辑 - 这只是与我的应用程序的其他用户共享部分对象 CoreData 数据库的一种方法,因此我认为我不需要子类化 NSDocument
的复杂性。
该类非常基本,有两个属性 String
和一个引用应用沙箱中图像的 NSImage
文件名。
最初,我考虑使用文档包,基本上是一个包含图像的文件夹(如果需要)以及一个包含字符串和图像文件名的 plist。 现在,我倾向于创建一个仅用于导出和导入的类,它使用 NSCoding 将图像和字符串保存到文件中。
这是我不确定的事情:
- 这是个好主意吗?我在这里错过了什么吗?
- 我可以将具有
NSImage
和String
属性的对象数组保存到单个文件中吗?我知道我可以相当轻松地保存图像,但是我可以将它们捆绑到一个文档中吗? NSCoding 是执行此操作的方法吗? - 我需要先将
NSImage
转换为NSData
吗? - 我的解码器如何知道文件的哪一部分是
String
以及哪一部分是NSImage
?
我已经研究过了!有很多关于保存图像或保存 NSDocument
的信息,但我只是想要一种简单的方法,让用户可以将任意数据导出和导入到我的文件中。应用程序的核心数据存储。
最佳答案
使用NSCoding
,您可以保存每个内置支持该协议(protocol)的类,或者添加它。 NSImage
和 – 当然 – NSString
都符合 NSCoding
。您只需将 NSCoding
支持添加到您的自定义类 which is pretty simple :
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.stringProperty forKey:@"String Property"];
[coder encodeObject:self.imageProperty forKey:@"Image Property"];
}
- (instancetype)initWithCoder:(NSCoder*)coder
{
self = [super init]; // or `-initWithCoder:, if it is supported
if (self)
{
self.stringProperty = [coder decodeObjectForKey:@"String Property"];
self.imageProperty = [coder decodeObjectForKey:@"Image Property"];
}
return self;
}
如果您想将数据保存为属性列表文件,您只能使用属性列表类。 NSString
is a property list, but NSImage
is not – 当然你的自定义类不是。因此,您必须将 NSImage
的实例和自定义类转换为 NSData
的实例,因为 NSData
是一个属性列表。你可以用 –drum-roll –NSCoding
来做到这一点。只需使用带 key 的存档器即可。 +archivedDataWithRootObject:
(NSKeyedArchiver
) 的结果是 NSData
的实例。返回的方式是使用 NSKeyedUnarchiver
。
但是,如果您不想使用通用属性列表工具对其进行编辑,那么选择属性列表的文件格式就没有什么理由。
因此,直接回答您的问题:
is this a good idea? Am I missing something here?
没关系
can I save an array of objects with NSImage and String properties into a single file?
由于 NSArray
符合 NSCoding
并且是一个属性列表,因此这两种方法都可以开箱即用。
I know I can save an image, fairly easily, but can I bundle them up into a single document?
您是文件的所有者并定义文件格式。继续吧。
Is NSCoding the way to do this?
是的。
Do I need to convert the NSImage to NSData first?
仅当您想要保存属性列表文件时。
关于swift - 将具有 String 和 NSImage 属性的类导出到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047312/