RestKit嵌套的一对多关系映射很慢

Posted

技术标签:

【中文标题】RestKit嵌套的一对多关系映射很慢【英文标题】:RestKit nested one-to-many relationship mapping is very slow 【发布时间】:2014-08-21 16:09:32 【问题描述】:

在我正在处理的几个项目中,我注意到当一对多关系嵌套在 API 响应中时,关系映射会花费很长时间并导致某些加载屏幕出现瓶颈。我在工具中描述了这个问题,没有一种方法可以脱颖而出,只有几种与关系映射相关的方法。即使未使用核心数据,此问题仍然存在。我想知道是否有任何设置、方法或属性可以用来加速关系映射过程。

我创建了一个测试项目来突出这些问题。该项目有一个测试套件,它使用 RestKit 和 OHHTTPStubs 将一些 json 固定装置映射到一组自定义对象中。测试项目 repo 可以在这里找到:https://github.com/rtimpone/restkit_relationship_mapping_benchmarking。使用的数据模型很简单,但利用了一对多的关系。它不使用核心数据。我将 RestKit 关系映射的结果与手动映射作为参考点,我不希望关系映射像手动映射一样快。

在设置 RestKit 或对象映射时,我可以做些什么来加快关系映射?在设置我的映射或响应描述符时是否缺少某些步骤?映射嵌套关系时,这种性能是典型的吗?任何有关此主题的帮助或建议将不胜感激。

【问题讨论】:

【参考方案1】:

仅通过在 valueTransformersForTransformingFromClass 中引入缓存并让 RKDictionaryByMergingDictionaryWithDictionary 调用 addEntriesFromDictionary 而不是使用似乎做同样事情的自己的逻辑,您的测试运行速度提高了 20%。 务必清除 addValueTransformer、removeValueTransformer 和 insertValueTransformer 中的缓存 NSDictionary。

NSDictionary *RKDictionaryByMergingDictionaryWithDictionary(NSDictionary *dict1,      NSDictionary *dict2)

    if (! dict1) return dict2;
    if (! dict2) return dict1;

    NSMutableDictionary * const result = [dict1 mutableCopy];
    [result addEntriesFromDictionary:dict2];
    return result;


- (NSArray *)valueTransformersForTransformingFromClass:(Class)sourceClass toClass:(Class)destinationClass

    if (sourceClass == Nil && destinationClass == Nil) return [self.valueTransformers copy];
    else if (sourceClass == Nil || destinationClass == Nil) [NSException raise:NSInvalidArgumentException format:@"If you specify a source or destination class then you must specify both."];
    @synchronized(self.valueTransformersForClassesCache)
    
        NSString * const cacheKey = [NSString stringWithFormat:@"%@_to_%@", NSStringFromClass(sourceClass), NSStringFromClass(destinationClass)];
        NSMutableArray *matchingTransformers = [self.valueTransformersForClassesCache valueForKey:cacheKey];
        if(!matchingTransformers)
        
            matchingTransformers = [NSMutableArray arrayWithCapacity:[self.valueTransformers count]];
            for (RKValueTransformer *valueTransformer in self) 
                if (! [valueTransformer respondsToSelector:@selector(validateTransformationFromClass:toClass:)]
                || [valueTransformer validateTransformationFromClass:sourceClass toClass:destinationClass]) 
                    [matchingTransformers addObject:valueTransformer];
                
        

        [self.valueTransformersForClassesCache setObject:matchingTransformers forKey:cacheKey];
    

    return [matchingTransformers copy];

【讨论】:

原来的 RKDictionaryByMergingDictionaryWithDictionary 不是简单的合并两个字典;它也合并了所有子词典。您的实施速度更快,但结果可能会有所不同。

以上是关于RestKit嵌套的一对多关系映射很慢的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

RestKit .22:无法成功映射与嵌套 JSON 的关系

如何使用 RestKit 指定关系?

Restkit:嵌套关系映射

如何保持对象一对多 RestKit

RestKit 将未嵌套关系映射到拥有对象