He leído el capítulo de Marcus Zarra sobre multiprocesamiento en su libro Core Data y he examinado bastante de cerca su código de muestra. Pero su código y otros que he encontrado en otros lugares parecen estar enfocados en procesos en segundo plano que no son y no que necesitan conocerse. Estos ejemplos son buenos para importar una estructura de árbol, pero no abordan la importación de una estructura más general (compleja), como un gráfico acíclico dirigido.Core Data y multiprocesamiento
En mi caso, estoy tratando de analizar una jerarquía de clases C++ y me gustaría usar tantas NSOperations como sea posible. Me gustaría crear una instancia de NSManagedObject para cada clase encontrada y me gustaría fusionar diferentes NSManagedObjectContexts cada vez que se guarde uno.
Como nota aparte: puedo hacer que las cosas funcionen con una sola operación NSO que itera de archivos y analiza de a uno por vez. En esta implementación, el enfoque -mergeChanges: que llama a -mergeChangesFromContextDidSaveNotification: en el MOC del subproceso principal funciona bien.
Pero idealmente, tendría un NSOperation iterar sobre los archivos fuente y engendrar NSOperations para analizar cada archivo. He intentado varios enfoques, pero parece que no puedo hacerlo bien. Lo más prometedor fue que cada NSOperation observara NSManagedObjectContextDidSaveNotification. Con -mergeChanges: aspecto:
- (void) mergeChanges:(NSNotification *)notification
{
// If locally originated, then trigger main thread to merge.
if ([notification object] == [self managedObjectContext])
{
AppDelegate *appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
return;
}
// If not locally originated, then flag need to merge with in this NSOperation's thread.
[self setNeedsToMerge:YES];
[self setMergeNotification:notification];
}
En esencia, el análisis de la NSOperation principal() verificaron Ivar 'needsToMerge' periódicamente. Si era cierto, se invocó a -mergeChangesFromContextDidSaveNotification: en MOC local con NSNotifications almacenadas en caché. Y luego se restauró needsToMerge. Si la notificación se había originado localmente, se le indicó al subproceso principal que realizara -mergeChangesFromContextDidSaveNotification: en su MOC.
estoy seguro de que hay una buena razón por la que esto no funcionó y por qué me sale esto:
advertencia: Cancelación de llamada - código objc en la pila del hilo actual hace esta inseguro.
También han tratado de utilizar el bloqueo de NSPeristentStoreCoordinator para controlar el acceso - pero esto es problemático si se lleva a cabo durante una llamada para -save de NSManagedObjectContext: método porque -save: notificará a los observadores interesados de guardar el evento y -mergeChangesFromContextDidSaveNotification: parece bloquear el intentar adquirir el bloqueo de PSC.
Parece que esto debería ser mucho más fácil.
esta es una buena solución. Para mí, probablemente necesitaría aplicar changeNotifications antes de buscar un objeto además de antes de guardarlo, pero sería fácil. Según lo entiendo, todos los hilos (excepto el hilo principal) serían instancias de esta subclase. Es ese el caso? – westsider
@Westsider todo NSOperation que necesita fusionar el contexto debe ser una subclase de la misma. Básicamente sugiero crear una clase NSOperationManagedOobjectContextAware que tenga un método mergeChanges y las 3 propiedades changeNotifications, changeNotificationsLock, localManagedObjectContext –