从 RKMappingResult 获取对象

Posted

技术标签:

【中文标题】从 RKMappingResult 获取对象【英文标题】:Get objects from RKMappingResult 【发布时间】:2014-03-24 16:37:57 【问题描述】:

如何从RKMappingResult 获取特定类型的对象? 我需要建立从RKMappingResults 中的映射数据到现有对象的关系。

我试过了:

[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】:

成功块在主线程上调用,因此您不需要切换或后台上下文。

如果您要使用后台上下文,则不应直接使用返回的托管对象 - 您需要获取每个托管对象的 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];
    

【讨论】:

以上是关于从 RKMappingResult 获取对象的主要内容,如果未能解决你的问题,请参考以下文章

RKMappingResult 有对象,但它们 NSLog 为 null

RESTKit:带有字典的 RKMappingResult

RestKit postObject 方法中的 post 对象与它返回的 RKMappingResult 有啥关系?

RestKit 响应映射问题 - <RKMappingResult:, results= "<null>" =

如何从 JSchema/ Map JsonObjects 获取父对象名称到新父对象

从 ggmap 对象获取边界框