Reputation: 917
I'm in a project where we use RestKit. We was using the 0.9.2 version until we decided to upgrade to 0.10.0. After some little changes in my code to make it compatible with the new version of RestKit I found a error when I use loadObjectsAtResourcePath: usingBlock:. When I receive the response in my delegate with the function -(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects, the array of objects have the correct objects but they are not saved in the cache of coreData. If I try to access to access them with a fetch to coreData I don't find them. Here some code I use:
Configuration of RestKit:
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:[NSURL URLWithString:@"http://myweb.com/web/app.php/ws"]];
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = NO;
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"db.sqlite"];
RKManagedObjectMapping* boAccount = [RKManagedObjectMapping mappingForClass:[BOAccount class] inManagedObjectStore:objectManager.objectStore];
boAccount.primaryKeyAttribute = @"boAccountID";
[boAccount mapKeyPathsToAttributes: @"id", @"boAccountID",
@"created_at", @"createDate",
@"date_expiration", @"expirationDate",
@"date_billing", @"billingDate",
@"nb_authorized_devices", @"numberOfAuthorizedDevices",
nil];
[objectManager.mappingProvider addObjectMapping:boAccount];
[objectManager.mappingProvider setMapping:boAccount forKeyPath:@"account"];
The call to load loadObjectsAtResourcePath: usingBlock:
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/connection" usingBlock:^(RKObjectLoader *loader){
RKParams *params= [RKParams params];
//[params setValue:_password.text forParam:@"password"];
[params setValue:[Encrypt encryptWithPublicKeyMessage:_password.text] forParam:@"password"];
[params setValue:_email.text forParam:@"email"];
[params setValue:udid forParam:@"udid"];
[params setValue:name forParam:@"name"];
loader.delegate = self;
loader.params= params;
loader.method= RKRequestMethodPOST;
} ];
-(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader{
BOAccount* account;
NSArray* accounts = [BOAccount allObjects];
account = [accounts objectAtIndex:0];
}
But the array accounts is empty. I tried -(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader{ too but it gives me the same result. I know I can get the object I want with the array objects but I need to have the objects in the DB for my project. I know the objects are well parsed because I have see the array objects of objectLoaderDidFinishLoading and all is right.
Anyone know whats happening? Before the update this function works right!
Update: I found that if I delete the application from the simulator or iPad sometimes it works the next time... I thought that it could help for fins an answer. Can be that I try to use the items before RestKit put it in cache?
Upvotes: 3
Views: 1966
Reputation: 9380
You need to manually save the objects into the CoreData's database:
loader.onDidLoadObjects = ^(NSArray *objects) {
// Save:
NSError* error = nil;
[[RKObjectManager sharedManager].objectStore.managedObjectContextForCurrentThread save:&error];
if (error) {
NSLog(@"Save error: %@", error);
}
}
Upvotes: 3