3
votes

I'm trying to update my existing app that was using Restkit 0.1 to 0.20 but I'm facing some problems when setting up the Core Data Stack as it runs into an exception.

I've got the following code on my AppDelegate:

     /*
     Complete Core Data stack initialization
     */
    NSError *error = nil;
    NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"AppModel" ofType:@"momd"]];
    // NOTE: Due to an iOS 5 bug, the managed object model returned is immutable.
    NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
    [managedObjectStore createPersistentStoreCoordinator];
    NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"TSI.sqlite"];
    NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];
    //NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error];
    NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error];
    NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);
    /*
     RESTKIT
    */
    // Create the managed object contexts
    [managedObjectStore createManagedObjectContexts];
     managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

And then my mappings are being set within the TableViewController as per:

    RKManagedObjectStore *managedObjectStore = [RKManagedObjectStore defaultStore];
    NSManagedObjectContext* context = [managedObjectStore mainQueueManagedObjectContext];

    NSString *rootKeyPath;
    rootKeyPath = @"body";
    NSString *endpoint = @"account/login.json";
    RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
    [entityMapping addAttributeMappingsFromDictionary:@{
     @"api_token":@"token",
     @"email":   @"email",
     @"first_name":  @"name",
     @"last_name":   @"surname"
     }];
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping pathPattern:endpoint keyPath:rootKeyPath statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[TSI_SERVER stringByAppendingString:endpoint]]];
    RKManagedObjectRequestOperation *managedObjectRequestOperation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[ responseDescriptor ]];
    //managedObjectRequestOperation.managedObjectContext = self.managedObjectContext;
    [[NSOperationQueue currentQueue] addOperation:managedObjectRequestOperation];

But whenever I try to retrieve the data after the view is loaded I get the following error in the console (for security reasons I've masked the name and server my App uses):

2013-04-16 14:41:50.576 <<MyApp>>[4525:907] I restkit:RKLog.m:34 RestKit logging initialized...
2013-04-16 14:41:51.009 <<MyApp>>[4525:907] [HEATMA.PS] Running Heatma.ps version 4.0.2. For help go to www.heatma.ps/support 
2013-04-16 14:42:54.464 <<MyApp>>[4525:3907] *** Assertion failure in
-[RKManagedObjectResponseMapperOperation performMappingWithObject:error:], /Users/manuel_matute/Code/RestKit/Code/Network/RKResponseMapperOperation.m:358 
2013-04-16 14:42:59.876 <<MyApp>>[4525:3907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = http://www.<<myserver>>.com/rest/account/login.json)'
 *** First throw call stack: (0x32a7b2a3 0x3a7a397f 0x32a7b15d 0x33350ab7 0xe37e1 0xe1b97 0x333085c1 0x33380be3 0x3abbb11f 0x3abbf961 0x3abbfac1 0x3abefa11 0x3abef8a4) libc++abi.dylib: terminate called throwing an exception

Does anyone have an idea about what could be the problem?

Thanks!

1

1 Answers

6
votes

Solved!

Looks like I needed to explicitly assign the context to the managedObjectRequestOperation as:

managedObjectRequestOperation.managedObjectContext = context;