Recostackción de loggings de multihilo de datos centrales

Tengo una duda sobre el multihilo en conetworkingata. si estamos utilizando multihilo, deberíamos usar NSManagedObjectContext por separado para insert nuevos datos o actualizar, o si no, podemos usar el método de context hijo primario. Pero solo estoy creando NSManagedObjectContext nuevo. Mi pregunta es que debo utilizar NSManagedObjectContext por separado para incluso search en el hilo de background también. Si no (es decir, podemos utilizar la queue principal NSManagedObjectContext solamente) que por qué estoy obteniendo el error __psynch_mutexwait.

Gracias,

Primero, Core Data es seguro para subprocesss. Sin embargo, debe seguir las reglas:

  1. NSManagedObjectContext está enlazado por subprocess. Solo puede usarlo en el hilo al que está asignado. -init hace que se -init un context al hilo en el que se creó. Usando -initWithConcurrencyType: le permitirá crear contexts asociados a otros hilos / queues.
  2. Cualquier NSManagedObject asociado con un NSManagedObjectContext está vinculado al mismo subprocess / queue que el context del que provenía
  3. No hay una tercera regla

Puede pasar instancias de NSManagedObjectID entre subprocesss, pero las reglas 1 y 2 deben obedecerse. Desde su descripción, creo que está violando estas reglas.

Personalmente tampoco recomiendo utilizar NSManagedObjectID. Hay mejores soluciones. – Marcus S. Zarra

Marcus, esta es la explicación más sucinta de Threading de Core Data que he leído. Después de haberlo utilizado desde su presentación, ¡hay días en los que aún me equivoco! Mencionas "mejores soluciones", ¿puedes elaborar?

Tengo una fuerte desconfianza sobre el uso del NSManagedObjectID . No se mantiene igual desde el ciclo de vida de una aplicación a otra en muchas situaciones. Originalmente, en base a la documentation, nosotros (los desarrolladores de cocoa en general) creíamos que se estaba generando nuestra mítica key primaria. Eso ha resultado ser incorrecto.

En el desarrollo moderno con contexts padre / hijo, el paisaje es aún más confuso y hay algunas trampas interesantes que debemos tener en count. Dado el outlook actual, me disgusta más que antes. Entonces, ¿qué usamos?

Deberíamos generar el nuestro. No tiene por qué ser mucho. Si sus datos ya no tienen una key primaria del server (bastante común tener una id de un server basado en Ruby), entonces cree uno. Me gusta llamarlo guid y luego tener un -awakeFromInsert similar a este:

 - (void)awakeFromInsert { [super awakeFromInsert]; if (![self primitiveValueForKey:@"guid"]) { [self setPrimitiveValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:@"guid"]; } } 

NOTA: este código está escrito en el browser web y es posible que no se compile.

Comtesting el valor porque -awakeFromInsert se -awakeFromInsert una vez por context. Entonces generalmente tendré un método de conveniencia en mis instancias de NSManagedObject similar a:

 @implementation MyManagedObject + (MyManagedObject*)managedObjectForGUID:(NSString*)guid inManagedObjectContext:(NSManagedObjectContext*)context withError:(NSError**)error { NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:[self entityName]]; [fetch setPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"guid == %@", guid]]; NSArray *results = [context executeFetchRequest:request error:error]; if (!results) return nil; return [results lastObject]; } @end 

NOTA: este código está escrito en el browser web y es posible que no se compile.

Esto deja el control de errores y el control contextual / subprocesamiento al desarrollador, pero proporciona un método de conveniencia para recuperar un object en el context actual y nos permite "rebotar" un object de un context a otro.

Esto es más lento que -objectWithID: y debe usarse con cuidado y solo en situaciones en las que necesita rebotar un object de un context a otro después de que un guardado lo mueva por la stack.

Como con la mayoría de las cosas que hago; esta no es una solución genérica . Es una línea de base que debe ajustarse por proyecto.