Хранение изображений локально на устройстве iOS

Некоторые приложения для iOS, связанные с фотографиями, хранят изображения, созданные с помощью приложения, где-нибудь, кроме библиотеки фотографий. Например, Fat Booth показывает прокручиваемый список фотографий, созданных с помощью приложения, при запуске приложения. Обратите внимание, что эти фотографии сохраняются без явного сохранения пользователем их в библиотеке фотографий. Каков самый простой способ сохранять изображения в приложении iOS?

Единственные постоянные хранилища, с которыми я знаком, - это NSUserDefaults и цепочка ключей. Однако я никогда не слышал, чтобы они использовались для хранения больших фрагментов данных, таких как изображение. Теперь мне интересно, является ли Core Data самым простым способом.


person SundayMonday    schedule 25.01.2013    source источник


Ответы (3)


Самый простой способ - сохранить его в каталоге документов приложения и сохранить путь с помощью NSUserDefaults следующим образом:

NSData *imageData = UIImagePNGRepresentation(newImage);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];

NSLog(@"pre writing to file");
if (![imageData writeToFile:imagePath atomically:NO]) 
{
    NSLog(@"Failed to cache image data to disk");
}
else
{
    NSLog(@"the cachedImagedPath is %@",imagePath); 
}

Затем сохраните imagePath в каком-нибудь словаре в NSUserDefaults или как хотите, а затем, чтобы получить его, просто выполните:

 NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
 UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
person Tommy Devoy    schedule 25.01.2013
comment
Здесь нет никого, но я думаю, что NSPicturesDirectory более уместен, чем NSDOcumentDirectory. - person Trasplazio Garzuglio; 18.06.2014
comment
@MarcoDinacci Почему? Это просто еще одна папка, не так ли? - person Supertecnoboff; 25.07.2016

Для Swift:

let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")

if !imageData.writeToFile(imagePath, atomically: false)
{
   println("not saved")
} else {
   println("saved")
   NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}

Для Swift 2.1:

let imageData = UIImagePNGRepresentation(selectedImage)
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")

if !imageData.writeToURL(imageURL, atomically: false)
{
    print("not saved")
} else {
    print("saved")
    NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
}

stringByAppendingPathComponent недоступен в Swift 2.1, поэтому вы можете использовать URLByAppendingPathComponent.. Дополнительные сведения см. здесь.

person Segev    schedule 25.11.2014
comment
Вопрос касается Objective-C, а не Swift. - person JasonMArcher; 27.11.2014
comment
@JasonMArcher Я не согласен, я искал Objective-C, потому что не нашел ответа для Swift. Это помогло мне, потому что это было то, что я искал в первую очередь. - person Chris; 23.01.2015
comment
Я получаю Попытка установить объектный файл, не относящийся к списку свойств. - person Machado; 21.09.2016

Вы можете сделать это с основными данными, сохранив двоичные данные, но это не рекомендуется. Есть способ получше - особенно для фотографий. В вашем приложении есть каталог документов / файлов, доступ к которому имеет только ваше приложение. Я рекомендую начать здесь, чтобы узнать о концепциях и о том, как получить к ним доступ. Это относительно просто. Вы можете объединить это с основными данными для хранения путей к файлам, метаданных и т. Д. http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html

person Sean    schedule 25.01.2013