-->

RKObjectMapping和RKEntityMapping的关系(Relationship be

2019-10-19 04: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

当书籍属性的数组CoreData书的对象。 我使用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

Answer 1:

这之间的区别RKObjectRequestOperationRKManagedObjectRequestOperation 。 因为你只有1个响应描述符和一个对象(而不是管理对象)相匹配,RestKit将使用RKObjectRequestOperation 。 这样做时,被管理对象存储是不是所以没有管理的对象可以创建映射时可用。

一种解决方法:

除了使用1所响应描述的,使用2.第一个刚刚创建BooksResponse和映射hits 。 第二个创建Book S和映射的name

一旦操作完成后,您将提供一个映射响应,其字典有2项:零和“书籍”。 null键保存BooksResponse实例和“书籍”键保存Book的情况。 现在,您可以更新BooksResponse实例来填充关系。

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



文章来源: Relationship between RKObjectMapping and RKEntityMapping