我如何设法从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: { ......
如何正确获取正确的对象并建立关系?
答案 0 :(得分:3)
在主线程上调用成功块,因此您不需要开关或背景上下文。
如果您打算使用后台上下文,则不应该直接使用返回的托管对象 - 您需要获取每个托管对象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];
}
}