2010-01-25 25 views
6

Me pregunto si es una buena elección para almacenar las imágenes con datos fundamentales a la propiedad binariaCoreData (para iPhone) almacenamiento de imágenes

decir que tengo una colección de películas y quiero guardar la imagen de la cubierta de DVD en una propiedad de la el tamaño promedio de una cubierta es de 20/30 kb (320x480px)

la razón por la que quiero hacer esto es para la gestión del almacenamiento, una vez que borrar la película sé que la imagen también se elimina

no soy apenas bastante seguro si es una buena idea, carga de datos, velocidad?

¿Alguien tiene experiencia con esto?

+0

Este es un duplicado de http://stackoverflow.com/questions/1168954/storing-large-eg-image-movie-files-in-core-data-on-the-iphone y http: // stackoverflow. com/questions/2090028/core-data-storage-images-iphone –

Respuesta

11

Me parece que el almacenamiento de imágenes en un núcleo de datos no es una buena idea, y estoy seguro de que también lo he leído en una de las guías de programación de Apple. Simplemente considere esto, cuando busque su colección, todas las imágenes también se cargarán en la memoria, incluso si solo muestra 8 imágenes, toda su colección de imágenes se cargará con los datos centrales.

Si desea asegurarse de que elimine los archivos de imagen cuando un registro medida fue eliminada sugiero escuchar comunicaciones de los managedObjectContext y borrar archivos cuando se elimina una película:

Usted puede inscribirse en el willSave o hizo una notificación, cada una con sus propias ventajas/desventajas.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext]; 

Obtención de los objetos eliminados:

- (void) contextDidSave:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 
    for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey]) 
    { 
     // Code for deleting file associated with the NSManagedObject, you can still 
     // access the managed object's properties. 
    } 
} 
+2

No hay nada de malo en almacenar datos binarios en Core Data, especialmente de los tamaños de imagen con los que el OP está trabajando. Revise los dos enlaces publicados como una nota a la pregunta. Cualquier cosa por debajo de 100 KB puede almacenarse fácilmente directamente en Core Data. –

+1

Por supuesto que se puede hacer, pero en mi opinión simplemente no es la mejor manera de hacerlo, a menos que pueda controlar si los datos binarios realmente se obtienen y se cargan en la memoria. De lo contrario, obtener 100 registros cargará 2/3mb en la memoria sin ningún motivo. –

+0

Preferiblemente, simplemente guarde los filepaths como cadenas en coredata y cárguelos de esa manera? – powerj1984

1

Se me ocurrió que se puede utilizar otro enfoque que podría ser mejor si ya está la subclasificación NSManagedObject para su entidad película.

Puede implementar el método didSave o willSave en NSManagedObject y marcar la propiedad isDeleted. Si se elimina, elimine la imagen del disco.

7

El mejor método es almacenar la ruta a la imagen en el objeto administrado y luego eliminar el archivo en el método prepareForDeletion del objeto.

0

Véase mi respuesta en:

Can I access the files used for external binary storage in Core Data?

Puede almacenar archivos de gran tamaño en la base de datos ahora utilizando la opción 'de almacenamiento externo permite'. El único problema con esto ya no es tener acceso a los archivos reales por ruta, solo los datos binarios puros. Se me ocurrió una solución 'creativa' (si la mejor práctica es la de cualquier persona), pero le permitirá usar Core Data para administrar sus archivos mientras aún puede acceder a los archivos REAL por su ruta.

Cuestiones relacionadas