#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?