2009-09-21 19 views
14

En la documentación de Datos principales de Apple para Concurrency with Core Data, enumeran el método preferido para la seguridad de subprocesos como el uso de un NSManagedObjectContext independiente por subproceso, con un NSPersistentStoreCoordinator compartido.Uso multiproceso de Datos básicos (NSOperationQueue y NSManagedObjectContext)

Si tengo un número de NSOperations ejecutándose una detrás de otra en un NSOperationQueue, ¿habrá una gran sobrecarga que cree el contexto con cada tarea?

Con NSOperationQueue teniendo un recuento máximo de operación simultánea de 1, muchas de mis operaciones utilizarán el mismo subproceso. ¿Puedo usar el diccionario de subprocesos para crear un NSManagedObjectContext por subproceso? Si lo hago, ¿tendré problemas para limpiar mis contextos más tarde?

¿Cuál es la forma correcta de utilizar Core Data en esta instancia?

Respuesta

19

La forma correcta de utilizar datos básicos en este caso es crear un NSManagedObjectContext separada por operación o tener un único contexto el que bloquea (a través de -[NSManagedObjectContext lock] antes de su uso y después de su uso -[NSManagedObjectContext unlock]). El enfoque bloqueado puede tener sentido si las operaciones son en serie y no hay otros subprocesos usando el contexto.

Qué enfoque utilizar es una pregunta empírica que no puede ser consultada sin datos. Hay demasiadas variables para tener una regla general. Los números duros de las pruebas de rendimiento son la única forma de tomar una decisión informada.

+1

FYI - 'lock' y' unlock' están en desuso en iOS8 y OSX 10.10. La recomendación es: "Usar un contexto de estilo de cola y -performBlockAndWait: en su lugar" –

2

Las operaciones que comenzaron a utilizar NSOperationQueue utilizando una cuenta de operación simultánea máxima de 1 no ejecutarán todas las operaciones en el mismo subproceso. Las operaciones se ejecutarán una después de la otra, pero se creará un nuevo hilo cada vez.

Por lo tanto, la creación de objetos en el diccionario de subprocesos será de poca utilidad.

+2

No hay garantía de que será un hilo nuevo cada vez. De hecho, en Snow Leopard, NSOperationQueue usa Grand Central Dispatch que explícitamente reutiliza los hilos. –

+0

Esta pregunta es sobre el iPhone, no sobre Snow Leopard. Y, por supuesto, no hay ** garantía **, ¿hay alguna vez? –

2

Si bien esta pregunta es antigua, en realidad está en la parte superior de los resultados de búsqueda de Google en 'NSMangedObjectContext threading', por lo tanto, voy a agregar una nueva respuesta.

El nuevo método 'preferido' es utilizar initWithConcurrencyType: y decirle al MOC si se trata de un hilo principal MOC o un hilo secundario moc. Luego puede usar los nuevos métodos performBlock: y performBlockAndWait: y el MOC se encargará de las operaciones de serialización en su hilo 'nativo'.

El problema entonces es cómo manejas inteligentemente la fusión de los datos entre los diversos MOC que tu aplicación puede engendrar, junto con otros mil detalles que hacen que la vida sea 'divertida' como programador.

Cuestiones relacionadas