从 RKMappingResult 获取对象
Posted
技术标签:
【中文标题】从 RKMappingResult 获取对象【英文标题】:Get objects from RKMappingResult 【发布时间】:2014-03-24 16:37:57 【问题描述】:如何从RKMappingResult
获取特定类型的对象?
我需要建立从RKMappingResult
s 中的映射数据到现有对象的关系。
我试过了:
[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: ......
如何获取正确的对象并正确建立关系?
【问题讨论】:
【参考方案1】:成功块在主线程上调用,因此您不需要切换或后台上下文。
如果您要使用后台上下文,则不应直接使用返回的托管对象 - 您需要获取每个托管对象的 id 并在其他上下文中查找...
mappingResult
可以返回 array
和 dictionary
,其中字典键是创建对象的响应描述符的键路径。因此,如果您有多个具有不同键路径的响应描述符,则应改用 dictionary
。
如果您不能这样做,那么您需要在处理项目时对其进行过滤。在快速枚举中设置类类型不会为您做到这一点(那将是黑魔法),您需要自己做:
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];
【讨论】:
以上是关于从 RKMappingResult 获取对象的主要内容,如果未能解决你的问题,请参考以下文章
RKMappingResult 有对象,但它们 NSLog 为 null
RestKit postObject 方法中的 post 对象与它返回的 RKMappingResult 有啥关系?
RestKit 响应映射问题 - <RKMappingResult:, results= "<null>" =