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】:这是RKObjectRequestOperation
和RKManagedObjectRequestOperation
之间的区别。因为您只有 1 个响应描述符并且它匹配一个对象(不是托管对象),所以 RestKit 将使用 RKObjectRequestOperation
。当它这样做时,托管对象存储在映射期间不可用,因此无法创建托管对象。
解决方法:
使用 2 而不是使用 1 个响应描述符。第一个只是创建 BooksResponse
并映射 hits
。第二个创建Book
s 并映射name
。
操作完成后,您将获得一个映射响应,其字典包含 2 个键:null 和“books”。空键保存BooksResponse
实例,“books”键保存Book
实例。您现在可以更新 BooksResponse
实例以填充关系。
注意,映射响应中的键对应于 2 个响应描述符上指定的键路径。
【讨论】:
以上是关于RKObjectMapping 和 RKEntityMapping 的关系的主要内容,如果未能解决你的问题,请参考以下文章
通过主键与 RKObjectMapping 和 RKEntityMapping 的关系
RestKit RKObjectMapping .. 嵌套和一次性对象
RestKit:给定 RKObjectMapping、object.class 和 JSON 字符串,如何获取映射对象?