说我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'
我在ManagedObjectStore
实例上存在RKObjectManager
执行期间检查过。应用程序在课程RKMappingOperation:355
上挂起
id currentValue = [self.destinationObject valueForKeyPath:keyPath];
有没有办法可以在普通的objectiveC对象和NSManagedObject
之间建立关系,以便JSON
只保留CoreData
个响应的一部分?
答案 0 :(得分:1)
这是RKObjectRequestOperation
和RKManagedObjectRequestOperation
之间的差异。因为您只有1个响应描述符并且它与对象(不是托管对象)匹配,所以RestKit将使用RKObjectRequestOperation
。执行此操作时,托管对象库在映射期间不可用,因此无法创建托管对象。
解决方法:
不使用1个响应描述符,而是使用2.第一个只创建BooksResponse
并映射hits
。第二个创建Book
并映射name
。
操作完成后,将为您提供映射响应,其字典包含2个键:null和“books”。 null键包含BooksResponse
实例,“books”键包含Book
实例。您现在可以更新BooksResponse
实例以填充关系。
注意,映射响应中的键对应于2个响应描述符上指定的键路径。