Сохранение / перезагрузка изображений и удаление старых изображений

#iphone #ios #uiimage #nsuserdefaults

#iPhone #iOS #uiimage #nsuserdefaults

Вопрос:

Я загружаю файл изображения с веб-сервера, а затем сохраняю его в nsuserdefaults. код сохранения примерно:

 NSData *imageData = UIImagePNGRepresentation(theImage); // theImage is a UIImage
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:imageData forKey:string]; // string is a 3-dig number which identifies image
  

Теперь, по-видимому, я уже не на той ноге, поскольку изображения не рекомендуются для nsuserdefaults..

Но что я хочу сделать, так это сохранить эти изображения где-нибудь, чтобы к ним можно было получить доступ без необходимости их повторной загрузки. Кроме того, я хотел бы удалить старые изображения (скажем, дневной давности или сохранить только последние 10 загруженных изображений)? Есть ли хороший метод для этого?

Ответ №1:

В зависимости от вашей цели, есть несколько мест, где вы можете сохранить загруженные изображения:

  • Если вы хотите сохранить файл до его удаления, выполните запись в каталог documents: [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • Если вы хотите сохранить файл до тех пор, пока не удалите его, и вы, возможно, когда-нибудь воспользуетесь iTunes file sharing и не хотите, чтобы к этим конкретным файлам предоставлялся общий доступ, напишите в службу поддержки приложений: [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • Если вы хотите разрешить системе удалять его, если на устройстве не хватает места (и вас не волнует, сохранено ли оно при создании резервной копии устройства), используйте каталог caches: [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • Если вы просто сохраняете его временно во время обработки и сразу же удалите, используйте временный каталог: NSTemporaryDirectory()

Если вам нужны какие-либо правила хранения, такие как «сохранить только 10» или «удалить через один день», вам придется реализовать это в своем коде самостоятельно. Вы могли бы полагаться на даты изменения файла (из NSFileManager attributesOfItemAtPath:error: ), или сохранить сопоставление имени файла с датой в NSUserDefaults или Core Data, или просто назвать файлы, чтобы указать дату.

Ответ №2:

Когда дело доходит до изображений, я рекомендую сохранить их на диск, в изолированной среде приложения есть папка Documents. Вы могли бы легко сохранить имя файла в userdefaults и использовать его позже для доступа к файлу.

Если вы хотите выяснить, не является ли изображение «слишком старым», вы можете сделать что-то вроде этого:

 int aDayInSeconds = 60 * 60 * 24;

NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fileName 
                                                                            error:nil];
NSDate *creationDate = [attributes objectForKey:@"NSFileCreationDate"];

if ([[NSDate date] timeIntervalSinceDate:creationDate] > aDayInSeconds) {
    // Delete, reload, whatever you need.
}
  

Ответ №3:

Я бы использовал отличную библиотеку ASIHTTPRequest для загрузки изображения в первую очередь 🙂

Это заменяет NSURLConnection, и вы можете указать, как кэшировать изображения — вы просто повторно запросите изображения с того же URL, и ASIHTTPRequest вернет кэшированные изображения.

Комментарии:

1. Есть ли рабочий пример кэширования изображений ASIHTTPRequest для использования в UITableView?