RKObjectMapping 和 RKEntityMapping 的关系

Posted

技术标签:

【中文标题】RKObjectMapping 和 RKEntityMapping 的关系【英文标题】:Relationship between RKObjectMapping and RKEntityMapping 【发布时间】:2014-01-09 13:09:46 【问题描述】:

假设我有这样的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 中?

【问题讨论】:

您提出什么要求?我猜托管对象存储没有对映射可用。 简单的http GET请求。所有其他在简单 ObjC 类和 CoreData 类之间没有关系的实体映射都可以工作。 【参考方案1】:

这是RKObjectRequestOperationRKManagedObjectRequestOperation 之间的区别。因为您只有 1 个响应描述符并且它匹配一个对象(不是托管对象),所以 RestKit 将使用 RKObjectRequestOperation。当它这样做时,托管对象存储在映射期间不可用,因此无法创建托管对象。

解决方法:

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

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

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

【讨论】:

以上是关于RKObjectMapping 和 RKEntityMapping 的关系的主要内容,如果未能解决你的问题,请参考以下文章

使用 RKObjectMapping 进行递归映射?

通过主键与 RKObjectMapping 和 RKEntityMapping 的关系

RestKit RKObjectMapping .. 嵌套和一次性对象

RestKit:给定 RKObjectMapping、object.class 和 JSON 字符串,如何获取映射对象?

RestKit - RKObjectMapping 只运行一次

使用 RKObjectMapping 的嵌套映射