Search code examples
iosnsarrayrestkitrkobjectmapping

Restkit mapping objects to NSArray


I have an object that consists of some fields such as:

@property (nonatomic, copy)     NSString*               title;
@property (nonatomic, copy)     NSString*               body;
@property (nonatomic, copy)     NSArray*                imageUrls;
@property (nonatomic, copy)     NSString*               postId;
@property (nonatomic)           CLLocationCoordinate2D  location;
@property (nonatomic)           LTUser                  *user;
@property (nonatomic)           LTPlace                 *place;
@property (nonatomic, copy)     NSArray*                comments;

All NSString and custom objects (such as LTUser/LTPlace) and it is mapping well.

But, how can I map to the NSArray of (imageUrls - which is an array of NSString / comments - which is an array of custom objects (LTComment))?

"images": [
        "http://****.com/images/1385929903887.jpg",
        "http://****.com/images/131315313131.jpg",
        "http://****.com/images/1351351351.jpg"
]

Mapping for main object:

RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[LTUser class]];
[userMapping addAttributeMappingsFromDictionary:@{
                                                  @"_id":@"userId",
                                                  @"username":@"userName",
                                                  @"name":@"name"
                                                  }];   

RKObjectMapping *placeMapping = [RKObjectMapping mappingForClass:[LTPlace class]];
[placeMapping addAttributeMappingsFromDictionary:@{
                                                   @"_id":@"placeId",
                                                   @"image":@"name",
                                                   @"name":@"image"
                                                   }];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[LTPost class]];

[mapping addAttributeMappingsFromDictionary:@{
                                              @"_id" : @"postId",
                                              @"createdAt" : @"createdAt",
                                              @"body" : @"body",
                                              @"title" : @"title"
                                              }];

[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"user" toKeyPath:@"user" withMapping:userMapping]];
[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"place" toKeyPath:@"place" withMapping:placeMapping]];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                        method:RKRequestMethodGET
                                                                                   pathPattern:kLTAPIGetPostsRequest
                                                                                       keyPath:@"posts"
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

LTComment mapping

RKObjectMapping* commentMapping = [RKObjectMapping mappingForClass:[LTComment class]];
[commentMapping addAttributeMappingsFromDictionary:@{
                                                     @"user_name":@"userName",
                                                     @"text":@"text"
                                                     }];

Solution

  • The mapping for comments should be just like you mappings for user and place (just with a different mapping obviously, commentMapping). RestKit will determine that the destination is a collection and that the source is a collection and do the right thing.

    For imageUrls, the JSON is already an array of strings so RestKit can basically copy it. All you need to do is add to the 'container' mapping (whichever that one is):

    @"images" : @"imageUrls"