¿Cuál realiza una recuperación más rápida, usando SELF IN o ==?
Frecuentes
Visto 93 equipos
0
Digamos que tengo una entidad llamada User
y una entidad llamada Message
. Un usuario tiene varios mensajes (relación a muchos) y un mensaje solo tiene un autor.
Diga ahora que quería recibir todos los mensajes de este usuario. Tengo dos opciones:
predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ ", user.messages];
predicate = [NSPredicate predicateWithFormat:@"authorEmail == %@ ", user.email];
¿Cuál sería más rápido y por qué? Suponga que el usuario email
está indexado.
1 Respuestas
0
Si te preocupa el rendimiento, no vuelvas a buscar. Obtener es siempre caro porque ir a buscar siempre tiene que leer del sistema de archivos (por convención). Si ya tiene los datos en la memoria, simplemente use un UITableViewController sin un NSFetchedResultsController.
Si no le importa el rendimiento, entonces no importa de ninguna manera.
Respondido 05 Jul 12, 13:07
Eso no es exacto. La búsqueda es económica a menos que dispare una falla. Incluso entonces, no significa automáticamente que se deba leer el almacenamiento persistente si los datos están disponibles en la caché de filas. Solo si se trata de un error Y no está disponible en la memoria caché, se leerá del disco. - svena
Eso no es verdad. Ejecutar un NSFetchRequest siempre toque el sistema de archivos y obtenga objetos de la base de datos. Siempre. No importa si hay una falla o no. No importa si el objeto ya está en la memoria o no. - Daniel Eggert
Lo que dices simplemente no es cierto Daniel. Core Data mantiene una caché de filas que se verificará primero antes de realizar un viaje a la tienda persistente. Además, puedes probar esto fácilmente. Si tiene un objeto (sin fallas) puesto en contexto y realiza modificaciones al mismo objeto en el almacenamiento persistente a través de otro contexto, su contexto original no estará al tanto de los cambios cuando lo obtenga. Solo cuando use -refreshObject:mergeChanges: se actualizará desde el almacén persistente o el contexto principal. Puede verificar fácilmente mi reclamo en el caché utilizando Instruments y Core Data stack. - svena
It is cierto cuando hablamos de NSFetchRequest. Por contrato, NSFetchRequest siempre irá al sistema de archivos. Esto es muy diferente de cómo funciona la falla. Simplemente puede probar esto: Establecer com.apple.CoreData.SQLDebug
a 1
y ejecutar la misma solicitud de búsqueda una y otra vez. Verá que tocará la base de datos todas y cada una de las veces. NSFetchRequest obtendrá de la base de datos independientemente de la caché de fila. - Daniel Eggert
Acepto que se ejecutarán las sentencias SQL. Solo digo que no llegará al sistema de archivos real IO, sino que se servirá desde la memoria caché en su lugar. - svena
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas iphone objective-c ios core-data or haz tu propia pregunta.
Ah, y la razón por la que incluso querría obtener los mensajes de un usuario a través de SELF IN user.messages aunque ya los tengo en la relación es para poder ponerlos en un NSFetchedResultsController: Snowman
La herramienta de rendimiento puede ayudarlo a resolver esto. Configure un programa de prueba que realice muchas de estas operaciones y ejecútelo a través del generador de perfiles. - Almo