Search code examples
iosobjective-crestkitrestkit-0.20

Mapping with Restkit 0.20 this class is not key value coding-compliant for the key


Hello I am having problem mapping data from the api using restkit. I have this below data. I really appreciate anyone who can point out my mistake.

{"GameId":1,"Items":

[{"Id":1,"PicUrl":"someurlhere","Answers":

["Paris","New York","San Francisco","Rome"],"CorrectAnswer":"San Francisco","Categories"}]}

And this is how i am planning to store the data at the client side:

#import <Foundation/Foundation.h>

GameObjects.h

    @interface GameObjects : NSObject
    @property(nonatomic, strong)NSNumber *GameId;
    @property(nonatomic,strong)NSMutableArray *Items;
    @property(nonatomic,strong)NSNumber *IId;
    @property(nonatomic,strong)NSURL *PicUrl;
    @property(nonatomic,strong)NSMutableArray *Answers;
    @property(nonatomic,strong)NSString *CorrectAnswer;
    @property(nonatomic,strong)NSString *CategoryName;
    @end



GameObjects.m

#import "GameObjects.h"

@implementation GameObjects
@synthesize GameId;
@synthesize Items;
@synthesize Answers;
@synthesize IId;
@synthesize CategoryName;
@synthesize CorrectAnswer;
@synthesize PicUrl;
- (id)init
{
    self = [super init];
    if (self) {

        Items = [[NSMutableArray alloc]initWithObjects:PicUrl,Answers,CorrectAnswer,CategoryName, nil];

    }
    return self;
}

@end

ANd this is how I do the mapping:

-(void)viewDidLoad
{

    //restkit
    RKObjectMapping *GameMapping = [RKObjectMapping mappingForClass:[GameObjects class]];

    [GameMapping addAttributeMappingsFromDictionary:@{   @"GameId":@"GameId",
                                                         @"Items": @"Items",
                                                         @"Id": @"Id",
                                                         @"PicUrl": @"PicUrl",
                                                         @"Answers":@"Answers",
                                                         @"CorrectAnswer":@"CorrectAnswer",
                                                         @"CategoryName":@"CategoryName"
                                                         }];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:GameMapping method:RKRequestMethodGET pathPattern:nil keyPath:@"GameId" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    NSURL *URL = [NSURL URLWithString:@"someurlhere"];
    NSURLRequest *request =[NSURLRequest requestWithURL:URL];
    RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]];
    [objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        RKLogInfo(@"Load collection of Articles: %@", mappingResult.array);
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        RKLogError(@"Operation failed with error: %@", error);
    }];
    [objectRequestOperation start];


}

And my output:

2013-09-30 14:28:04.204 FlickRest[3826:a0b] I restkit:RKLog.m:34 RestKit logging initialized...
2013-09-30 14:28:04.478 FlickRest[3826:a0b] ViewController - viewDidLoad
2013-09-30 14:28:12.158 FlickRest[3826:a0b] I restkit.network:RKObjectRequestOperation.m:180 GET 'someurlhere'

2013-09-30 14:28:18.243 FlickRest[3826:1a07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFNumber 0x8e20580> valueForUndefinedKey:]: this class is not key value coding-compliant for the key GameId.'
*** First throw call stack:
(
    0   CoreFoundation                      0x020ca5e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01e4d8b6 objc_exception_throw + 44
    2   CoreFoundation                      0x0215a6a1 -[NSException raise] + 17
    3   Foundation                          0x00c95b0a -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 282
    4   Foundation                          0x00c02b61 _NSGetUsingKeyValueGetter + 81
    5   Foundation                          0x00c0219b -[NSObject(NSKeyValueCoding) valueForKey:] + 260
    6   Foundation                          0x00c21c9a -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 409
    7   FlickRest                           0x0007fc31 -[RKMappingSourceObject valueForKeyPath:] + 833
    8   FlickRest                           0x00085247 -[RKMappingOperation applyAttributeMappings:] + 1671
    9   FlickRest                           0x0008cc3e -[RKMappingOperation main] + 4062
    10  Foundation                          0x00ca9a69 -[__NSOperationInternal _start:] + 671
    11  Foundation                          0x00c26798 -[NSOperation start] + 83
    12  FlickRest                           0x0007a2c5 -[RKMapperOperation mapRepresentation:toObject:atKeyPath:usingMapping:metadata:] + 1957
    13  FlickRest                           0x00078b40 -[RKMapperOperation mapRepresentation:atKeyPath:usingMapping:] + 1904
    14  FlickRest                           0x0007b4bd -[RKMapperOperation mapRepresentationOrRepresentations:atKeyPath:usingMapping:] + 829
    15  FlickRest                           0x0007be12 -[RKMapperOperation mapSourceRepresentationWithMappingsDictionary:] + 2210
    16  FlickRest                           0x0007c7db -[RKMapperOperation main] + 1403
    17  Foundation                          0x00ca9a69 -[__NSOperationInternal _start:] + 671
    18  Foundation                          0x00c26798 -[NSOperation start] + 83
    19  FlickRest                           0x000ccb7a -[RKObjectResponseMapperOperation performMappingWithObject:error:] + 1354
    20  FlickRest                           0x000cabb3 -[RKResponseMapperOperation main] + 2371
    21  Foundation                          0x00ca9a69 -[__NSOperationInternal _start:] + 671
    22  Foundation                          0x00c26798 -[NSOperation start] + 83
    23  Foundation                          0x00cabd34 __NSOQSchedule_f + 62
    24  libdispatch.dylib                   0x028de4b0 _dispatch_client_callout + 14
    25  libdispatch.dylib                   0x028cc088 _dispatch_queue_drain + 450
    26  libdispatch.dylib                   0x028cbe85 _dispatch_queue_invoke + 126
    27  libdispatch.dylib                   0x028cce25 _dispatch_root_queue_drain + 83
    28  libdispatch.dylib                   0x028cd13d _dispatch_worker_thread2 + 39
    29  libsystem_c.dylib                   0x02bf6e72 _pthread_wqthread + 441
    30  libsystem_c.dylib                   0x02bdedaa start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Solution

  • You have set the response descriptor keyPath:@"GameId", but it should be keyPath:nil. By setting it to @"GameId" RestKit is navigating into the JSON and trying to apply all of your mapping contents to the NSNumber value that is set for the GameId key.