2013-09-30 66 views
0

你好,我有问题映射数据从api使用restkit。我有这个下面的数据。我非常感谢任何能指出我的错误的人。映射与Restkit 0.20这个类不是密钥编码兼容密钥

{"GameId":1,"Items": 

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

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

而且这也是我计划如何存储在客户端的数据:

#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 

,这是我做的映射:

-(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]; 


} 

而且我的输出:

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 

回答

5

您已经设置了响应描述符r keyPath:@"GameId",但它应该是keyPath:nil。通过将其设置为@"GameId" RestKit正在导航到JSON并尝试将所有映射内容应用于为GameId密钥设置的NSNumber值。

0

'这个类不是键值编码兼容的密钥'这个错误通常发生在映射中定义的键值关系与某个级别的JSON键值不匹配时。在你的情况下,通过将keyPath设置为'GameId'意味着你的JSON必须具有'GameId'的根密钥,而不是这种情况并导致崩溃。

相关问题