Clasificación en segundo plano de Core Data

Tengo un Department entidad que tiene una relación de uno a muchos con un Employee entidad. Durante el tiempo de ejecución, para cada Department objeto quiero mantener una matriz ordenada de Employee objetos (ordenados según algún atributo) que se utilizarán como modelo en varios objetos de vista.

Por lo que leí, hay dos formas de representar la matriz ordenada:

Rep1: definir una propiedad obtenida en Department (la clasificación se realiza mediante Core Data);

Rep2: manteniendo una variable de instancia sortedEmployees (NSArray of Employee objetos) en el Departamento (la clasificación se realiza mediante mi código).

Ahora, mi verdadero problema es que, cuando se inicia la aplicación, tengo una gran cantidad de Departments y Employees para recuperar de la tienda persistente. Quiero realizar la clasificación en segundo plano para no bloquear la interfaz de usuario.

He probado varios métodos que terminaron en futilidad:

Method1 (utilizando Rep1): En subprocesos en segundo plano (utilizando un NSOperationQueue), buscar todo Departments, luego ejecute la propiedad obtenida de cada uno. Luego, de vuelta en el hilo principal, busque el correspondiente Department objeto en el contexto del objeto gestionado del hilo principal (MOC) (por NSManagedObjectID) y usa la propiedad obtenida. Problema con el Método 1: la propiedad obtenida en el objeto Departamento del hilo principal no se completa incluso después de que se realiza la búsqueda del Departamento en segundo plano, lo que significa que se vuelve a buscar en el Departamento del hilo principal. Esto frustra todo el propósito de la búsqueda de fondo. ¿Me equivoco al suponer que una propiedad obtenida, una vez obtenida, existe en todos los MOC?

Method2 (utilizando Rep2): En subprocesos en segundo plano (utilizando un NSOperationQueue), buscar todo Departments, luego calcule cada uno sortedEmployees formación. Luego, de vuelta en el hilo principal, busque el objeto Departamento correspondiente en el hilo principal MOC (Por NSManagedObjectID) y establecer la matriz mencionada anteriormente en este objeto. Problema con el método 2: los objetos en el sortedEmployees matriz son Employee objetos pertenecientes al hilo de fondo MOC. Cuando el hilo principal intenta acceder a ellos más tarde, se produce un bloqueo con algo como "NSManagedObject with ID ... has been invalidated." Esto se debe a que cada subproceso debe tener su propio MOC (y sus objetos gestionados asociados).

Entonces, ¿cómo se clasifican los objetos administrados en segundo plano, si los objetos administrados no pueden existir a través de los límites del hilo? ¿Me estoy perdiendo de algo?

preguntado el 08 de noviembre de 11 a las 15:11

1 Respuestas

Pío,

No te estás perdiendo nada. Solo necesita convertir su matriz ordenada al nuevo MOC. Aquí hay un fragmento:

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count];

for (mo in array) {

    [ma addObject: [moc objectWithID: mo.objectID]];
}
return ma;

Eso migrará su matriz. Según tengo entendido, este es un proceso eficiente. Además, puede depender de la caché de filas para obtener un acceso de alto rendimiento a las propiedades.

Andrés

respondido 09 nov., 11:02

Gracias. ¿Puede explicar qué quiere decir con la dependencia de la caché de filas? ¿Qué fila de caché? - Pío

Además, ¿en qué hilo debo realizar la migración de matriz antes mencionada? En el caso del hilo principal, ¿no se invalidará "mo" y, por lo tanto, se equivocará cuando acceda a mo.objectID? En el caso del hilo en segundo plano, ¿no será problemático acceder a [moc objectWithID: ...] ya que moc pertenece al hilo principal? - Pío

Pius, el coordinador de la tienda persistente mantiene la caché de filas. Es una optimización automática del rendimiento. No lo mantiene, Core Data lo hace. Normalmente convierto las ID cuando estoy en el hilo de destino. Andrew PD Si le gustó esta respuesta, recuerde seleccionarla como la respuesta "correcta". - adonoho

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.