2012-06-22 22 views
7

Estoy ejecutando una solicitud de recuperación que devuelve unas 2000 entidades. Actualmente, esto demora unos 20 segundos en mi dispositivo. Así que pensé que podría establecer un límite de búsqueda de 100, y luego, cuando el usuario se desplace hasta el final de la vista de tabla, busque las siguientes 100 entidades. Esto se puede lograr usando NSFetchRequest'ssetFetchLimit y setFetchOffset.Resultados de obtención de datos básicos de procesamiento por lotes

Sin embargo, lo que no puedo entender es, si en mi segunda búsqueda donde estoy buscando objetos 101-200, ¿qué pasaría con los objetos del 1 al 100? ¿Tendría que usar NSFetchedResultsController por cada 100 elementos y luego configurar mis métodos de fuente de datos de vista de tabla para realizar consultas basadas en múltiples controladores de resultados de búsqueda? ¿O puedo de alguna manera usar el mismo NSFetchedResultsController para obtener de alguna manera 100 entidades a la vez, pero en cada búsqueda posterior, solo agregue los siguientes 100 artículos a los 100 elementos originales?

Editar: Aquí está mi código:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName]; 
    [fetchRequest setPredicate:predicate]; 
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:5]; 
+0

¿Puede mostrar su construcción de la solicitud de búsqueda? Por lo que yo sé, los controles de resultados obtenidos (y creo que las solicitudes de búsqueda simple también) utilizan fallas para hacer esto por usted. Es posible que su "consulta" pueda ser optimizada. –

+0

He publicado parte de mi código. No entiendo, ¿por qué tardan 20 segundos en buscar las entidades? Cuando establezco un límite de 100, se recupera en 1 segundo, pero sin un límite, que obtiene 2000 entidades, toma 20 segundos. – Snowman

Respuesta

2

En realidad no necesita hacer nada para lograr el ir a buscar en lotes de tamaño que ha especificado. Obtendrá el comportamiento que está describiendo simplemente ejecutando una única solicitud de extracción en un solo controlador: al configurar la propiedad del tamaño del lote, simplemente le está dando a CoreData el tamaño del lote óptimo que usted considera. CoreData manejará la búsqueda de objetos en lotes secuenciales del tamaño especificado según los necesite, y generará fallas en los objetos administrados cuando sea necesario para el consumo de memoria.

+0

¿Por qué tarda 20 segundos en buscar las entidades? Cuando establezco un límite de 100, se recupera en 1 segundo, pero sin un límite, que obtiene 2000 entidades, toma 20 segundos. – Snowman

+0

Bueno, todavía realiza las búsquedas según el tamaño que especifique. La obtención de 100 es más rápida que la obtención de 2000. En su fetchRequest, establezca el tamaño del lote en 50 o 100. Eso es todo. No hay nada más para eso. Todos sus registros continuarán cargándose según sea necesario, ya que CoreData maneja las siguientes capturas y fallas necesarias. – isaac

+0

Pero esta no es la solución, necesito eliminar la espera de 20 segundos, y establecer el tamaño del lote no parece marcar la diferencia. Además, lo extraño es que acabo de configurar el batchSize en 2000, y se obtuvo en 9 segundos, en comparación con un batchSize de 5, que tardó 20 segundos. ¿Que pasa con eso? – Snowman

3

El uso de ANY es una operación bastante costosa. No estoy seguro de las relaciones, pero podría intentar obtener su entidad de etiquetas para el nombre de etiqueta específico en lugar de su entidad de objeto de mensaje. A continuación, utilice la relación inversa para obtener las entidades de objeto de mensaje

También su género está utilizando un comparador que estoy seguro no está ayudando a las cosas. La fecha debe ser almacenada por datos centrales como un número entero para que pueda hacer una ordenación directa sin usar un selector.

Los datos principales son MUY rápidos, realicé una búsqueda por palabra clave a través de 65,000 registros y obtuve resultados en milisegundos.

Buena luc

+0

Si bien esto es cierto, en realidad no responde la pregunta .... – lnafziger

+3

Nunca se trata de respuestas, solo de guiar a las personas en la dirección correcta. – Snowman

+0

@tim que en realidad es una buena idea, acerca de recuperar el objeto de etiquetas individuales y obtener el conjunto de mensajes. Sería mucho más rápido. Sin embargo, ¿cómo puedo atar eso a un NSFetchedResultsController? Si una etiqueta tiene 2000 objetos, no quiero cargarlos todos en la memoria a la vez. Con un controlador de resultados de búsqueda, solo un puñado de ellos se cargarán en la memoria en un momento dado. – Snowman

Cuestiones relacionadas