Сохранить изображение и информацию об изображении на iPhone
Я получаю изображение и его информацию (происхождение и некоторую другую информацию) из Интернета. Как я могу сохранить это на iPhone? Я видел использование NSFileManager для хранения изображений, но как я могу хранить изображения и некоторую другую информацию с ним? Должен ли я использовать NSDictionary и ключи, такие как - изображение, происхождение, информация, а затем сохранить этот словарь в NSMutableArray и затем сохранить этот массив в NSFileManager?? Или есть какой-то другой способ? И небольшой совет по доступу к этим сохраненным изображениям и соответствующей информации был бы неплох.
Благодарю.
3 ответа
// Download Image from Remote Server
NSURL *url = [NSURL URLWithString:@"Your IMAGE URL HERE"];
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"moon" ofType:@"jpg"]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libPath = [paths objectAtIndex:0];
NSString *filePath = [libPath stringByAppendingPathComponent:[url lastPathComponent]];
BOOL status = [data writeToFile:filePath atomically:YES];
// Save Image file to Library Directory, if success then store infor about it in file
if(status)
{
// If File Exist then read it otherwise creat new
NSMutableDictionary *imageInfoDict;
if([[NSFileManager defaultManager] fileExistsAtPath:[libPath stringByAppendingPathComponent:@"imageInfo.plist"]])
{
NSData *fileData = [NSData dataWithContentsOfFile:[libPath stringByAppendingPathComponent:@"imageInfo.plist"]];
imageInfoDict = [NSMutableDictionary dictionaryWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithData:fileData]];
// To set As Background Load image from disc
// Read filename from Dictionary, but you must know the key which you want to get
NSString *fileName = imageInfoDict[@"68051_10151509108346729_1731694342_s.png"][@"imagePath"];
// Set your image as background
UIImage *image = [UIImage imageWithContentsOfFile:[libPath stringByAppendingPathComponent:fileName]];
}
else
imageInfoDict = [NSMutableDictionary dictionaryWithCapacity:0];
// Create Dictionary to store Single Image Info
NSDictionary *imageInfo = [NSDictionary dictionaryWithObjectsAndKeys:[url lastPathComponent], @"imagePath",
[url lastPathComponent], @"imageName",
[NSDate date], @"date",nil];
// Add Single Image Info to Main Dictionary
[imageInfoDict setValue:imageInfo forKey:[url lastPathComponent]];
// Convert Main info Dictionary to `NSData` to Save on Disc
NSData *fileData = [NSKeyedArchiver archivedDataWithRootObject:imageInfoDict];
// Save file to Disc
[fileData writeToFile:[libPath stringByAppendingPathComponent:@"imageInfo.plist"] atomically:YES];
// Read Info From File
NSLog(@"%@",[NSDictionary dictionaryWithContentsOfFile:[libPath stringByAppendingPathComponent:@"imageInfo.plist"]]);
}
Есть много способов в зависимости от ваших требований
1) SQLITE: сохранить метаданные изображения в таблице вместе с именем файла в строке
2) NSUserDefaults: если количество изображений довольно мало
3) Текстовый файл: напишите вам Данные, разделенные новой строкой, что также не должно быть трудным, опять же зависит от ваших требований.
Надеюсь это поможет.
Вы обязательно должны использовать CoreData и папку с документами приложения следующим образом:
- Загрузите данные с сервера: изображение и другие данные
- Сохраните изображение в папке документов приложения с созданным именем (если у вас еще нет имени изображения с сервера)
- Создайте таблицу CoreData (или несколько таблиц) в зависимости от ваших потребностей и укажите там имя изображения и остальные свойства. 4 Когда вы пытаетесь загрузить данные, вы можете извлечь данные из основной таблицы данных и загрузить изображение из каталога документов.
Я думаю, что это лучший и самый простой способ сделать это, если вы загружаете изображения только один раз.
Если вы хотите загружать разные изображения или обновлять изображения, вы можете использовать один и тот же процесс с указанием, что вам не следует сохранять изображения в папке документов, вам просто нужно использовать библиотеку AsyncImageDownload (их много), чтобы загрузить изображения и Вы должны сохранить URL изображения в вашей базе данных.