如何从 RKMappingResult
获取特定类型的对象?
我需要建立从 RKMappingResult 中的映射数据到现有对象的关系。
我已经尝试过:
[self getObjectsAtPath:[NSString stringWithFormat:@"%@%@", BASEURL restaurant.remoteID.stringValue] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
if (!mappingResult.array || !mappingResult.array.count) {
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error = [self requestFailed];
if (block) {
block(nil, error);
}
}) ;
} else {
__block BOOL done = NO;
[[[CoreDataManager sharedInstance] backgroundManagedObjectContext] performBlockAndWait:^{
for (Menu *menu in mappingResult.array) {
[restaurant addMenuObject:menu];
}
for (TableIds *tableId in mappingResult.array) {
[restaurant addTableIdsObject:tableId];
NSLog(@"%@", tableId);
}
[[CoreDataManager sharedInstance] saveBackgroundContext];
done = YES;
}];
if (done) {
dispatch_async(dispatch_get_main_queue(), ^{
if (block) {
block(mappingResult, nil);
}
});
}
}
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (block) {
block(nil, error);
}
}) ;
}];
在for循环中,我尝试获取已映射的两种类型的对象,但由于某种原因,它似乎找不到TableId
和Menu之间的区别
。因此,某些菜单会作为 tableId 添加,从而导致应用程序崩溃。
当我NSLog
所有TableIds
时我收到什么:
<Menu: 0x20e4dda0> (entity: Menu; id: 0xf19eec0 <x-coredata://9F31F549-BE4D-434C-935F-F689839989F2/Menu/p39> ; data: { ......
如何获取正确的对象并正确建立关系?
最佳答案
成功 block 在主线程上调用,因此您不需要开关或后台上下文。
如果您要使用后台上下文,则不应直接使用返回的托管对象 - 您需要获取每个托管对象 id 并在其他上下文中查找它...
mappingResult
可以返回一个数组
和一个字典
,其中字典键是创建对象的响应描述符的键路径。因此,如果您有多个具有不同关键路径的响应描述符,您应该使用字典
。
如果您无法做到这一点,那么您需要在处理项目时对其进行过滤。在快速枚举中设置类类型不会为你做到这一点(这将是黑魔法),你需要自己做:
for (NSManagedObject *object in mappingResult.array) {
if ([object isKindOfClass:[Menu class]]) {
[restaurant addMenuObject:(Menu *)menu];
} else if ([object isKindOfClass:[TableIds class]]) {
[restaurant addTableIdsObject:(TableIds *)tableId];
}
}
关于ios - 从 RKMappingResult 获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22615323/