将解析后的数据提供给RKMapperOperation会抛出NSUnknownKeyException

时间:2013-10-07 20:50:36

标签: ios restkit restkit-0.20

请参阅我的其他问题了解背景:Will RestKit's dynamic mapping solve this complex JSON mapping?

由于服务器构造我需要转换为NSManagedObject的json数据的方式,我传递解析的json来执行直接对象映射,如下所示:

RKObjectMapping *mapping = [RKObjectMapping requestMapping];
[mapping addAttributeMappingsFromDictionary:@{@"id": @"id", @"name": @"name"}];
NSDictionary *mappingsDictionary = @{ [NSNull null]: mapping };
RKMapperOperation *mapper = [[RKMapperOperation alloc]
        initWithRepresentation:dataArray mappingsDictionary:mappingsDictionary];
NSError *mappingError = nil;
BOOL isMapped = [mapper execute:&mappingError];
if (isMapped && !mappingError) {
    for (id thing in mapper.mappingResult.array) {
        NSLog(@"Mapped the '%@' thing: %@", NSStringFromClass([thing class]), thing);
    }
}

NSMutableArray,dataArray,如下所示:[ {id: 1, "name":"AAA"}, {id: 2, "name":"BBB"}, ...]

代码打印出一些字典,但我想要的是从我的数据模型类生成的Foo对象(.id和.name)。

如果我使用:

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Foo" inManagedObjectStore:store];

商店运行良好,因为它在'正常'的RestKit请求上成功,我收到错误:

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:实体(null)不是密钥值编码兼容的密钥“id”。'

我做错了什么?

更新:

根据Wain的建议,我补充道:

RKManagedObjectMappingOperationDataSource *mappingDS = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:store.mainQueueManagedObjectContext cache:store.managedObjectCache];
mappingDS.operationQueue = [NSOperationQueue new];

在上面的代码之前,然后,在创建映射器之后,在调用execute之前,我按照建议设置了数据源:

mapper.mappingOperationDataSource = mappingDS;

我得到了预期的NSManagedObject s。

1 个答案:

答案 0 :(得分:2)

映射器操作本身并不知道如何创建要映射到的类的实例。实体映射是正确使用的,但您需要教映射器操作如何实例化Foo对象。为此,您需要创建RKManagedObjectMappingOperationDataSource并将其设置为mappingOperationDataSource