RestKit: How does one post an array of objects? RestKit: How does one post an array of objects? ios ios

RestKit: How does one post an array of objects?


The restkit does not fund routable path for NSArray, because you defined your routing for NSManagedObject class. You probably want to create a custom class, say MySyncEntity that holds the ivars you define in your mapping. Then, you create your mapping like this:

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[MySyncEntity class]];....[myManager setSerializationMIMEType:RKMIMETypeJSON];[[myManager router] routeClass:[MySyncEntity class] toResourcePath:@"/sync"];

then you should be able to post your object to the API backend as JSON object.

Further clarification:

In this case, we want to post an array of NSManagedObject instances into a JSON based API. To do that we need to create a sync entity, that holds the objects in an array:

@interface MySyncEntity : NSObject {}@property (nonatomic, retain) NSArray* mySyncArray;...@end 

The mySyncArray will hold the payload we'd like to submit to the rest backend. Then, we create appropriate mapping for both NSManagedObject that will be sent in mySyncArray and the MySyncEntity entity itself.

RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:kBaseUrl];...RKObjectMapping *mngObjMapping = [RKObjectMapping mappingForClass:[NSManagedObject class]]; [mngObjMapping mapKeyPath: @"time" toAttribute:@"time"];  [mngObjMapping mapKeyPath: @"recordLevel" toAttribute:@"recordLevel"];.... //map as many properties as you wish[[manager mappingProvider] setSerializationMapping:[mngObjMapping inverseMapping]                                          forClass:[NSManagedObject class]];//now, we create mapping for the MySyncEntityRKObjectMapping *syncEntityMapping = [RKObjectMapping mappingForClass:[MySyncEntity class]];[syncEntityMapping mapKeyPath:@"mySyncArray" toRelationship:@"mySyncArray" withMapping:mngObjMapping];[[manager mappingProvider] setSerializationMapping:[syncEntityMapping inverseMapping]                                          forClass:[MySyncEntity class]];

Now with the mappings defined we can post the object to the server

[manager postObject:mySyncInstance delegate:nil];

The contents of mySyncInstance array will be mapped according to mngObjMapping and sent to defined rest endpoint.


As a further clarification, I'd like to point out that in mja's answer the key thing is

[syncEntityMapping mapKeyPath:@"mySyncArray" toRelationship:@"mySyncArray" withMapping:mngObjMapping];

This says "the mySyncArray keypath is an array which contains objects that should be mapped according to mngObjMapping".