Almacenamiento de imágenes en CoreData – Swift

En mi código logré save una label de text con CoreData, pero no puedo save correctamente la image. He leído algunos tutoriales y sé que tengo que convertirlo a NSData. Pero, ¿cómo lo hago?

¡Gracias por adelantado!

Core Data no debe save grandes files binarys como imágenes. Utilice el Directorio de documentos en el sistema de files.

Aquí hay un código de muestra para lograrlo.

let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String // self.fileName is whatever the filename that you need to append to base directory here. let path = documentsDirectory.stringByAppendingPathComponent(self.fileName) let success = data.writeToFile(path, atomically: true) if !success { // handle error } 

Se recomienda save la parte del filename en los datos centrales junto con otros metadatos asociados con esa image y recuperarlos del sistema de files cada vez que lo necesite.

editar: también tenga en count que a partir de ios8 en adelante, la url de file completo persistente no es válida ya que la aplicación de espacio aislado id-se genera dinámicamente. Necesitará get documentsDirectory dinámicamente según sea necesario.

No debe save grandes datos dentro de los datos centrales, un ingeniero de Apple me dijo este pequeño truco en la última WWDC:

Puede usar la propiedad "Permitir almacenamiento externo":

introduzca la descripción de la imagen aquí

Al hacer esto por lo que sé, su image se almacenará en algún lugar del sistema de files, y dentro de los datos centrales se saveá un enlace a su image en el sistema de files. cada vez que pida la image, los datos del núcleo recuperarán automáticamente la image del sistema de files.

Para save la image como NSData puede hacer lo siguiente:

 let image = UIImage(named: "YourImage") let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0)) managedObject?.setValue(imageData, forKey: "YourKey") 

Recuerde que 1.0 en la UIImageJPEGRrepresentatio significa que usa la mejor calidad y la image será grande y pesada:

La calidad de la image JPEG resultante, expresada como un valor de 0.0 a 1.0. El valor 0.0 representa la compression máxima (o la calidad más baja) mientras que el valor 1.0 representa la menor compression (o la mejor calidad).

Aquí tienes JPEG y PNG solo utilizas UIImagePNGRepresentación:

 let image = UIImage(named: "YourImage") let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0)) managedObject?.setValue(imageData, forKey: "YourKey") 

En general, los objects de datos grandes no se almacenan en una database ni en Core Data. En su lugar, guarde las imágenes en el directory del documento (o un subdirectory) y guarde el nombre del file en Datos básicos.

Se la respuesta de @Valentin sobre cómo crear una representación de datos de una image.

func writeToFile(_ path: String, atomically atomically: Bool) -> Bool con func writeToFile(_ path: String, atomically atomically: Bool) -> Bool