2009-11-12 15 views
5

Paso algunos datos de NSManagedObject entre dos subprocesos usando NSOperationQueue con nivel de concurrencia a un máximo de 1 y me gustaría recibir algunas sugerencias sobre si lo estoy haciendo correctamente.NSOperation y CoreData Threading

Dado que NSManagedObject no es seguro para subprocesos, estoy enviando el NSManagedObjectID desde ThreadA (hilo principal) a ThreadB a través de una clase derivada de NSOperation. El flujo general de trabajo:

ThreadA (hilo principal):

  • crea NSPersistentStoreCoordinator
  • crea principal NSManagedObjectContext (1)
  • crea NSManagedObjectContext (2) para su uso en WorkerThread

  • crea MyNSOperationItem, pasa a lo largo de NSManagedObjectContext y agrega MyNSOperationItem a NSOperationQueue

ThreadB (rosca de NSOperationQueue):

clase derivada
  • NSOperation será recuperar datos de la persistente
    tienda utilizando el IDobjeto suministrado.

Mi clase NSOperation se ve así:

@interface MyNSOperationItem: NSOperation 
{ 
    // MyNSOperationItem is created in thread1 and MOC will be 
    // set on creation 
    NSManagedObjectContext *threadedMOC; 

    NSManagedObjectID  *workItemObjectID; 
} 
@end 

Así que está bien para mi NSOperation clase derivada de tener una referencia a NSManagedObjectContext o debería almacenar la segunda NSManagedObjectContext otra parte? Como se trata de una cola, se crearán numerosas instancias de MyNSOperationItem, cada una de ellas apuntando al mismo NSManagedObjectContext.

Respuesta

5

creo que esto debe darle todo lo que necesita:

http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html

Si necesita descargar la FETCH para un subproceso de fondo, aquí hay una pequeña punta del documento que hace referencia anteriormente:

Obtención de un subproceso de fondo

una de las más simples multi-threading técnicas que puede utilizar con datos básicos para mejorar la capacidad de respuesta de la aplicación es ejecutar una solicitud de recuperación en un hilo de fondo . (Tenga en cuenta que esta técnica sólo es útil si usted está usando una tienda de SQLite, ya que los datos de tiendas binarios y XML se lee en la memoria inmediatamente en abierto.) Este significa que si una zona de alcance es complicada o devuelve un gran cantidad de datos, puede devolver el control al usuario y mostrar los resultados a medida que llegan. Para obtener un ejemplo de acerca de cómo hacerlo, consulte el ejemplo BackgroundFetching en /Developer/Examples/CoreData /.

Utiliza dos contextos de objetos gestionados asociados con un solo coordinador de tienda persistente . Se obtiene en un contexto de objeto gestionado en un subproceso y pasa los ID de los objetos recuperados a otro subproceso. En el segundo hilo (típicamente hilo principal de la aplicación , para que continuación, puede mostrar los resultados), se utiliza el segundo contexto al fallo en objetos con esos identificadores de objeto (utiliza objectWithID: para instanciar el objeto )

+0

El enlace hace referencia a una aplicación de muestra llamada 'BackgroundFetching' en '/ Developer/Examples/CoreData' - no existe tal directorio en mi máquina. ¿Alguna idea sobre dónde encontrar esa muestra? –

+0

Sí. Tienes razón. Y tampoco parece estar disponible en el sitio de desarrollo tampoco. No estoy seguro de lo que es el trato. Podría presentar una falla de documentación con Apple que señale la información desactualizada. Quizás lo actualicen con una nueva ruta o enlace. Por otra parte, tal vez lo actualicen y eliminen la ruta/enlace por completo. Lo siento por eso. –