Almacenamiento de imágenes localmente en un dispositivo iOS

Algunas aplicaciones iOS relacionadas con la fotografía almacenan imágenes creadas con la aplicación en algún lugar que no sea la biblioteca de fotos. Por ejemplo, Fat Booth muestra una list de desplazamiento de fotos creadas con la aplicación al inicio de la aplicación. Tenga en count que estas fotos se conservan sin que el usuario las guarde explícitamente en la biblioteca de fotos. ¿Cuál es la forma más sencilla de save y conservar imágenes dentro de una aplicación de iOS?

Las únicas tiendas persistentes con las que estoy familiarizado son NSUserDefaults y la cadena de keys. Sin embargo, nunca he oído hablar de estos utilizados para almacenar grandes cantidades de datos, como una image. Ahora me pregunto si Core Data es la manera más fácil.

La forma más simple es savelo en el directory de Documentos de la aplicación y save la ruta con NSUserDefaults así:

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); } 

Luego guarde imagePath en algún dictionary en NSUserDefaults o como quiera, y luego, para recuperarla, simplemente haga lo siguiente:

  NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"]; UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath]; 

Para 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") } 

Para 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 no está disponible en Swift 2.1, por lo que puede usar URLByAppendingPathComponent. Obtenga más información aquí.

Puede hacerlo con los datos centrales almacenando datos binarys, pero no es recomendable . Hay una forma mucho mejor, especialmente para fotos. Su aplicación tiene un directory de documentos / files al que solo puede acceder su aplicación. Recomiendo comenzar aquí por los conceptos y cómo acceder a él. Es relativamente sencillo. Es posible que desee combinar esto con los datos centrales para almacenar routes de files, metadatos, etc. http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html