将parsing的数据馈送到RKMapperOperation将引发NSUnknownKeyException
看到我的另一个问题的背景: RestKit的dynamic映射将解决这个复杂的JSON映射?
由于服务器的结构,我需要转换成NSManagedObject
的JSON数据的方式,我传递parsing的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请求,我得到的错误:
终止应用程序由于未捕获的exception“NSUnknownKeyException”,原因:'[valueForUndefinedKey:]:实体(空)不是密钥值编码兼容的密钥“ID”。
我究竟做错了什么?
更新:
按照Wain的build议,我补充说:
RKManagedObjectMappingOperationDataSource *mappingDS = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:store.mainQueueManagedObjectContext cache:store.managedObjectCache]; mappingDS.operationQueue = [NSOperationQueue new];
在上面的代码之前,然后在创build映射器之后,在调用execute
之前,我设置了数据源,如下所示:
mapper.mappingOperationDataSource = mappingDS;
我得到了预期的NSManagedObject
。
映射器操作本身不知道如何创build要映射到的类的实例。 实体映射是正确的,但是您需要教导映射器操作如何实例化Foo
对象。 为此,您需要创build一个RKManagedObjectMappingOperationDataSource
并将其设置为mappingOperationDataSource
。