【问题标题】:Relationship between RKObjectMapping and RKEntityMappingRKObjectMapping 和 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 类之间没有关系的实体映射都可以工作。

标签: ios json core-data restkit-0.20


【解决方案1】:

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

解决方法:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2011-12-22
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多