RestKit:'NSInternalInconsistencyException',原因:'无法执行映射:没有`managedObjectContext`分配

我收到以下错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = https://www.someurl.com/lastrequest=2014-12-08T02%3A44%3A52Z)' 

该应用程序停在RKResponseMapperOperation.m中的以下行:

 - (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error { NSLog(@"managedObjectContext: %@, Source Object: %@ Error: %@", self.managedObjectContext, sourceObject, (*error).description); NSAssert(self.managedObjectContext, @"Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = %@)", self.response.URL); .... 

我注意到,在应用程序崩溃之前,上述方法被称为27(这个数字变化)。 在每个实例中,NSManagedObjectContext存在,即下面的行:

 2014-12-07 18:44:48.721 MyApp[19011:3258405] managedObjectContext:managedObjectContext: <NSManagedObjectContext: 0x1701f5800>, Source Object: { friends = ( ); } Error: (null) 

然而在它崩溃之前,NSManagedObjectContext为null:

 2014-12-07 18:44:53.454 MyApp[19011:3258404] managedObjectContext: (null), Source Object: { friends = ( ); } Error: (null) 

由于应用程序正常运行一段时间才崩溃,我不知道如何解决这个问题。 任何指针将不胜感激。

*编辑*

在Appdelegaate。 用户login时,此方法在viewDidLoad中调用一次。

 - (RKManagedObjectStore *)managedObjectStore { if (!_managedObjectStore && [Persistence loggedIn]) { NSError * error; NSURL * modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"App" ofType:@"momd"]]; NSManagedObjectModel * managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy]; self.managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; [_managedObjectStore createPersistentStoreCoordinator]; NSArray * searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentPath = [searchPaths objectAtIndex:0]; NSString *dbName = [NSString stringWithFormat:@"%@App%@.sqlite", documentPath, [Persistence username]]; NSPersistentStore * persistentStore = [_managedObjectStore addSQLitePersistentStoreAtPath:dbName fromSeedDatabaseAtPath:nil withConfiguration:nil options:[self optionsForSqliteStore] error:&error]; NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error); NSLog(@"Path: %@", dbName); if(!persistentStore) { NSLog(@"Failed to add persistent store: %@", error); } [_managedObjectStore createManagedObjectContexts]; self.managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:self.managedObjectStore.persistentStoreManagedObjectContext]; return self.managedObjectStore; } return _managedObjectStore; } - (id)optionsForSqliteStore { return @{ NSInferMappingModelAutomaticallyOption: @YES, NSMigratePersistentStoresAutomaticallyOption: @YES }; } 

创buildMOC:对于核心数据堆栈,我在AppDelegate中使用了在Xcode中创build项目时提供的Default Core Data代码。

 - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } 

MOC操作:

 - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } 

在App内部,下面的方法用于设置,获取和清除ObjectManager:

 - (void)refreshMOC { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; self.objectManager = [self getObjectManager]; self.objectManager.managedObjectStore = appDelegate.managedObjectStore; self.objectManager.managedObjectStore.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache; self.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext; } - (RKObjectManager *)setupObjectManager { NSURL *baseURL = [NSURL URLWithString:kBaseURL]; AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:baseURL]; RKObjectManager *manager = [[RKObjectManager alloc]initWithHTTPClient:httpClient]; [manager.HTTPClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; [manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; [manager.HTTPClient setParameterEncoding:AFJSONParameterEncoding]; [RKMIMETypeSerialization registeredMIMETypes]; [RKObjectManager setSharedManager:manager]; return [RKObjectManager sharedManager]; } - (RKObjectManager *)getObjectManager { self.objectManager = (!self.objectManager) ? [self setupObjectManager] : self.objectManager; return self.objectManager; } - (RKObjectManager*)newObjectManager { [self clearRKObjectManager]; return [self getObjectManager]; } - (void)clearRKObjectManager { if (self.objectManager) { self.objectManager = nil; } } 

删除所有的应用程序委托模板核心数据方法。 当您使用RestKit并创build托pipe对象库时,您要求RestKit为您pipe理Core Data堆栈,因此不需要这些其他方法(并且混淆了事情)。

当您需要MOC时,从pipe理对象存储中获取/一个。

请注意,上述内容也适用于保存,因为您需要使用RestKit方法保存到持久性存储区,而不是只保存单个MOC。