请参阅我的其他问题了解背景:RestKit的动态映射能解决这个复杂的JSON映射吗?
由于服务器构造我需要转换成的 json 数据的方式NSManagedObject
s,我传递解析后的 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”的键值编码不兼容。”
我究竟做错了什么?
UPDATE:
根据韦恩的建议,我补充道:
RKManagedObjectMappingOperationDataSource *mappingDS = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:store.mainQueueManagedObjectContext cache:store.managedObjectCache];
mappingDS.operationQueue = [NSOperationQueue new];
在上面的代码之前,然后,在创建映射器之后,在调用之前execute
,我按照建议设置数据源:
mapper.mappingOperationDataSource = mappingDS;
我得到了预期的结果NSManagedObject
s.