只是一个猜测:我创建一个属性并使其类型为“二进制”。但最后,我将如何使用它?我猜幕后有一个NSData?那么该属性实际上是一个NSData?
答案 0 :(得分:18)
这个问题已被多次询问,答案有点复杂。
当谈到二进制数据时,您应该根据您将要使用的数据的预期大小来确定如何存储它。规则是:
此外,在存储图像时,建议以标准格式存储图像,例如JPG或PNG。通过使用transformable属性类型,当实际存储是PNG表示时,实际上您的子类可以提供访问UIImage
类的外观。我在Cocoa Is My Girlfriend上的沼泽帖中详细介绍了这一点。
存储>背后的原因磁盘上的1M二进制数据是由于缓存造成的。 NSPersistentStoreCoordinator
将保留数据缓存,以便当您的应用程序请求“下一个”对象时,它不需要返回磁盘。此缓存可以很好地真正。但它在iOS上很小,非常小。如果你输入一大块二进制数据,很容易就会破坏整个缓存,整个应用程序都会受到很大的影响。
答案 1 :(得分:1)
这是正确的,使用二进制表示为NSdata对象,然后你可以使用uiimages imageWithData类方法来检索你的图像。
答案 2 :(得分:0)
马库斯的回答是有效的,但这不是简单的方法 - 而且,AFAICT,并不是苹果“打算”你这样做的方式。理论上,您应该能够将图像标记为“可转换”,而CD将自动完成所有操作。
这不起作用,因为UIImage“缺少”NSCoding的实现 - Apple的序列化系统 - 因此CD的默认转换器不知道如何保存图像。
替代方案,需要一些代码,但仍然比Marcus的方法更简单......据称你遇到了Apple的错误。自2008年以来,Apple的CoreData实施(据称)已被破坏 - 任何“二进制”类型的数据存储都会忽略自定义变换器。
回到“CD会自动完成所有操作,如果只设置了UIImage”...恕我直言,UIImage应该是可序列化的,即使“默认”序列化并非适用于所有情况。如果你解决了这个问题,那么看看...... CoreData开始使用零编码保存/编码UIImage实例。
这是使您的UIImage实例全部可序列化的代码。您所要做的就是导入此类别/将此类别复制粘贴到您想要“升级”的UIImage版本的类中。
@implementation UIImage (MyCategory)
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeDataObject:UIImagePNGRepresentation(self)];
}
- (id)initWithCoder:(NSCoder *)decoder
{
NSData *data = [[decoder decodeDataObject] retain];
return [[UIImage alloc] initWithData:data];
}
@end