RestKit: How does one post an array of objects?

后端 未结 2 451
轮回少年
轮回少年 2020-12-01 08:39

Question summary:

Consider a class SyncObject that is KVC-compliant with properties such as: time, someValue,

相关标签:
2条回答
  • 2020-12-01 08:56

    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".

    0 讨论(0)
  • 2020-12-01 09:01

    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 MySyncEntity
    RKObjectMapping *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.

    0 讨论(0)
提交回复
热议问题