RKObjectMapping和RKEntityMapping之间的关系

时间:2014-01-09 13:09:46

标签: ios json core-data restkit-0.20

说我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个响应的一部分?

1 个答案:

答案 0 :(得分:1)

这是RKObjectRequestOperationRKManagedObjectRequestOperation之间的差异。因为您只有1个响应描述符并且它与对象(不是托管对象)匹配,所以RestKit将使用RKObjectRequestOperation。执行此操作时,托管对象库在映射期间不可用,因此无法创建托管对象。

解决方法:

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

操作完成后,将为您提供映射响应,其字典包含2个键:null和“books”。 null键包含BooksResponse实例,“books”键包含Book实例。您现在可以更新BooksResponse实例以填充关系。

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