2010-04-12 2 views
2

Я занимаюсь разработкой приложения для iPhone за последние несколько месяцев. Недавно я хотел повысить производительность и кэшировать несколько изображений, которые используются в пользовательском интерфейсе. Изображения загружаются случайно из Интернета пользователем, поэтому я не могу добавить определенные изображения в проект. Я также использую NSUserDefaults для сохранения другой информации в приложении.iPhone - Пользовательские настройки по умолчанию и UIImages

Так что теперь я пытаюсь сохранить словарь UIImages в мой NSUserDefaults объект и получить ...

- [UIImage encodeWithCoder]: непризнанные селектор направлен например

Я тогда решил подклассы UIImage с классом UISaveableImage и реализовать NSCoding. Итак, теперь я нахожусь ...

@implementation UISaveableImage 

-(void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:super forKey:@"image"]; 
} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    if (self=[super init]){ 
     super = [decoder decodeObjectForKey:@"image"]; 
    } 
    return self; 
} 

@end 

, который не лучше, чем где я начал. Если бы мне удалось преобразовать UIImage в NSData, я был бы хорош, но все, что я могу найти, - это функция UIImagePNGRepresentation, которая требует, чтобы я знал, какой тип изображения это был. Что-то, что UIImage не позволяет мне делать. Мысли? Я чувствую, что, возможно, побродил по неправильному пути ...

+0

Ответ Бена правильный, но ваше предположение о необходимости знать тип файла неверно. Представление UIImagePNGR возвращает NSData как PNG-файл, независимо от того, в каком формате он находился, когда он был загружен. –

ответ

6

Вы не хотите хранить изображения в NSUserDefaults. Они большие капли данных, а NSUserDefaults хранится как plist; вы хотите написать небольшие бит информации.

Вы должны записать образы на диск, а затем сохранить имена файлов по умолчанию:

NSString *filename = myImageFilename; 
[UIImagePNGRepresentation(image) writeToFile: myImageFilename atomically]; 
[[NSUserDefaults standardDefaults] setObject: myImageFilename forKey: @"lastImageFilename"]; 
+0

Получил. Последующий вопрос. Как память управляется на диске? Существует ли соответствующий метод типа removeFromFile? – Staros

+0

Посмотрите на NSFileManager. Там есть -removeItemAtPath: error: метод там, который будет делать то, что вы хотите. –

1

Наткнувшись на этот год спустя. Я бы добавил (в случае, если кто-то еще тоже споткнется здесь), что вы должны хранить изображения в каталоге кеша и не пытаться защитить их iTunes.

- (NSString *)pathForSearchPath:(NSSearchPathDirectory)searchPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES); 
    NSString *directoryPath = [paths objectAtIndex:0]; 
    return directoryPath; 
} 

- (NSString *)cacheDirectoryPath { 
    return [self pathForSearchPath:NSCachesDirectory]; 
}