我有一个'User'对象,其中包含'UIImage'类的属性。
如何将图像与其他属性一起编码并将其保存在NSUserDefaults
?
我的理解是我只能编码NSString
s?
例如,目前在我的代码中,我在编码/解码实现中添加avatar_url
(字符串)。如何将网址转换为UIImage
然后对其进行编码?
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.uid forKey:@"uid"];
[encoder encodeObject:self.avatar_url forKey:@"avatar_url"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if( self != nil ){
self.uid = [decoder decodeObjectForKey:@"uid"];
self.avatar_url = [decoder decodeObjectForKey:@"avatar_url"];
}
}
答案 0 :(得分:27)
正如评论中指出的,UIImage
符合NSCoding
,因此您可以直接对其进行编码,如下所示:
[encoder encodeObject:image forKey:@"image"];
这样做的好处是它(应该)存储图像的所有属性,包括scale
和imageOrientation
,如果它们没有设置为默认值,这可能非常重要。
但是,它确实存在一些您应该注意的风险。如果图片是直接从您的应用套装中加载的,则归档将包含图片名称,但不图像数据。如果存档包含图像数据,它将采用PNG格式,而您可能更喜欢JPEG格式,具体取决于您编码的图像类型。
使用UIImagePNGRepresentation
或UIImageJPEGRepresentation
将UIImage
转换为NSData
,然后对NSData
进行编码:
[encoder encodeObject:UIImagePNGRepresentation(self.image) forKey:@"image"];
稍后解码图像:
self.image = [UIImage imageWithData:[decoder decodeObjectForKey:@"image"]];