gpt4 book ai didi

ios - RKObjectMapping 和 RKEntityMapping 的关系

转载 作者:行者123 更新时间:2023-11-29 12:56:13 25 4
gpt4 key购买 nike

假设我有这样的 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 on line

id currentValue = [self.destinationObject valueForKeyPath:keyPath];

有没有一种方法可以在普通 objectiveC 对象和 NSManagedObject 之间建立关系,以便只有 JSON 响应的一部分保留在 CoreData 中?

最佳答案

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

解决方法:

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

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

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

关于ios - RKObjectMapping 和 RKEntityMapping 的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21021211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com