Как кодировать UIImage в `NSCoder` - PullRequest
7 голосов
/ 01 ноября 2011

У меня есть объект 'User', который содержит свойство класса 'UIImage'.

Как кодировать изображение вместе с другими свойствами и сохранить его в NSUserDefaults?

Насколько я понимаю, я могу только кодировать NSString с?

Например, в настоящее время в моем коде я добавляю avatar_url (строку) в реализации кодирования / декодирования. Как я могу преобразовать 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"];
    }
}

1 Ответ

27 голосов
/ 01 ноября 2011

UPDATE

Как указано в комментариях, UIImage соответствует NSCoding, так что вы можете просто закодировать его напрямую, например так:

[encoder encodeObject:image forKey:@"image"];

Это имеет то преимущество, что он (должен) хранить все свойства изображения, включая scale и imageOrientation, которые могут быть довольно важны для сохранения, если для них не установлены значения по умолчанию.

Однако, у него есть некоторые риски, о которых вы должны знать. Если изображение было загружено непосредственно из комплекта вашего приложения, архив будет содержать имя изображения, но не данные изображения. И если архив содержит данные изображения, он будет в формате PNG, в то время как вы можете предпочесть формат JPEG в зависимости от типа изображения, которое вы кодируете.

ORIGINAL

Используйте UIImagePNGRepresentation или UIImageJPEGRepresentation для преобразования UIImage в NSData, затем кодируйте NSData:

[encoder encodeObject:UIImagePNGRepresentation(self.image) forKey:@"image"];

Чтобы декодировать изображение позже:

self.image = [UIImage imageWithData:[decoder decodeObjectForKey:@"image"]];
...