RKObjectMapping和RKEntityMapping之间的关系

说我有这样的JSON

 { "hits": 4056, "books": [ { "name": "Book 1" }, { "name": "Book 2" }, { "name": "Book 3" } ] } 

我想将这个响应映射到BooksResponse对象:

 @interface BooksResponse @property (nonatomic, assign) NSInteger hits; @property (nonatomic, strong) NSArray* books; @end 

其中books属性是CoreData Book对象的数组。 我正在使用RKObjectEntity来映射BooksResponse如下所示:

 RKObjectMapping* booksResponseMapping = [RKObjectMapping mappingForClass:[BooksResponse class]]; [booksResponseMapping addAttributeMappingsFromDictionary:@{ @"hits" : @"hits" }]; [booksResponseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"books" toKeyPath:@"books" withMapping:[self booksMapping]]]; 

而booksMapping是这样实现的:

 RKEntityMapping* bookMapping = [RKEntityMapping mappingForEntityForName:@"Book" inManagedObjectStore:[self managedObjectStore]]; [bookMapping addAttributeMappingsFromDictionary:@{ @"name" : @"name" }]; 

但每当RestKit尝试执行映射时都会发生崩溃:

 CoreData: error: Failed to call designated initializer on NSManagedObject class 'Book' 

我检查,在执行过程中, RKObjectManager实例上存在RKObjectManager 。 应用程序在类RKMappingOperation:355上挂起

 id currentValue = [self.destinationObject valueForKeyPath:keyPath]; 

有没有办法可以使简单的objectivec对象和NSManagedObject之间的关系,以便只有部分的JSON响应持久在CoreData

这是RKObjectRequestOperationRKManagedObjectRequestOperation 。 因为你只有1个响应描述符,并且它匹配一个对象(不是托pipe对象),所以RestKit将使用RKObjectRequestOperation 。 当它这样做时,托pipe对象库在映射期间不可用,因此不能创build托pipe对象。

解决方法:

而不是使用1响应描述符,使用2.第一个只创buildBooksResponse并映射hits 。 第二个创buildBook并映射name

一旦操作完成,您将获得一个映射响应,其字典包含2个键:null和“books”。 null键保存BooksResponse实例,“books”键保存Book实例。 您现在可以更新BooksResponse实例来填充关系。

请注意,映射响应中的键对应于2个响应描述符上指定的键path。