Restkit devuelve diferentes instancias

Tengo serios problemas desde que migré mi lógica de datos básicos a RKManagedObjectStore. Configuré un NSFetchedResultsController con el context configurado en [NSManagedObject managedObjectContext] dentro del hilo principal en el controller de vista:

assert([NSThread isMainThread]); NSManagedObjectContext* context = [NSManagedObject managedObjectContext]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"]; 

Inserto objects en el context como este:

 Item* item = [Item object]; item.name = @"Foo"; [[RKObjectManager shanetworkingManager].objectStore save]; 

Pero el controller de resultados obtenido no recibe notificación de los cambios. Por lo tanto, registré una notificación manualmente:

 [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) { NSLog(@"Context changed"); [self.fetchedResultsController performFetch:nil]; [self.tableView reloadData]; }]; 

Esto realmente no debería ser necesario, creo, ya que RKManagedObjectStore fusiona los cambios en diferentes contexts. En segundo lugar, para eliminar el object de artículo que intenté

 [item deleteEntity]; 

Esto produjo un error que indica que el object no se puede eliminar dentro de otro context. Esto es obviamente cierto, pero ¿POR QUÉ diablos el context no es la misma instancia para el hilo principal? Llamé a lo siguiente también dentro del controller de vista justo antes de eliminar la entidad:

 assert([NSThread isMainThread]); NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext]; NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext; assert(sameContext1 == sameContext2); //FAILS 

Si se examina la implementación getter de managedObjectStore de RKManagedObjectStore, que se llama cuando se utiliza [NSManagedObject managedObjectContext], se debe devolver la misma instancia por subprocess:

 -(NSManagedObjectContext*)managedObjectContext { NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary]; NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey]; ... } 

Finalmente rastré ese desagradable error después de horas de debugging. El problema es que RKObjectManager tiene una reference a RKManagedObjectStore . Pero, de alguna manera, al usar ARC, esa reference no se guarda en la [RKObjectManager shanetworkingManager] y se está desasignando. Eso provoca el lavado del caching local de subprocesss. Por lo tanto, la combinación de context de object gestionado no funciona porque en cada acceso se crea un nuevo context gestionado. La solución es fácil. Solo mantén una fuerte reference al RKManagedObjectStore en tu Delegado de aplicaciones y ya está.