从RKMappingResult获取对象

时间:2014-03-24 16:37:57

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

我如何设法从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循环中,我尝试获取已映射的两种类型的对象,但由于某种原因,它似乎无法找到TableIdMenu之间的差异。所以一些菜单被添加为tableId会导致应用程序崩溃。

我收到的内容例如NSLog所有TableIds

<Menu: 0x20e4dda0> (entity: Menu; id: 0xf19eec0 <x-coredata://9F31F549-BE4D-434C-935F-F689839989F2/Menu/p39> ; data: { ......

如何正确获取正确的对象并建立关系?

1 个答案:

答案 0 :(得分:3)

在主线程上调用成功块,因此您不需要开关或背景上下文。

如果您打算使用后台上下文,则不应该直接使用返回的托管对象 - 您需要获取每个托管对象ID并在其他上下文中查找...

mappingResult可以返回arraydictionary,其中字典键是创建对象的响应描述符的关键路径。因此,如果您有多个具有不同密钥路径的响应描述符,则应使用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];
    }
}