Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Самый простой способ - сохранить его в каталоге документов приложений и сохранить путь с помощью 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];

Ответ 2

Для 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. Получите больше информации здесь.

Ответ 3

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