ios - 从 RKMappingResult 获取对象

标签 ios objective-c core-data restkit restkit-0.20

如何从 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循环中,我尝试获取已映射的两种类型的对象,但由于某种原因,它似乎找不到TableIdMenu之间的区别。因此,某些菜单会作为 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/

相关文章:

ios - Segue 可选值 nil

ios - 发送到实例的 CoreData 无法识别的选择器

ios - 对于 CoreData,如果我有一个 @dynamic 属性,我可以像 @synthesized 一样覆盖它的 getter 吗? (惰性实例化)

ios - 根据uiswitch状态显示数据

ios - 如何在 CollectionView 委托(delegate)方法之外实例化自定义类 UICollectionViewCell?

iphone - 如何确定当前运行的异步 GCD 调度队列

iphone - 如何使用 Apple 钥匙串(keychain)?

iphone - 从 plist 文件读取时,NSDictionary 包含 <nil> 值

iphone - Objc_msgSend 和应用程序崩溃

objective-c - 使用获取的请求排序描述符