Локално съхраняване на изображения на 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

Можете да го направите с основни данни, като съхранявате двоични данни, но не се препоръчва. Има много по-добър начин - особено за снимките. Вашето приложение има директория с документи/файлове, до която само вашето приложение има достъп. Препоръчвам да започнете от тук за концепциите и как да получите достъп до тях. Това е сравнително лесно. Може да искате да комбинирате това с основни данни, за да съхранявате файлови пътища, метаданни и т.н. html" rel="noreferrer">http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html

person Sean    schedule 25.01.2013