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

时间:2014-08-21 16:09:32

标签: ios restkit

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

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

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

1 个答案:

答案 0 :(得分:0)

通过在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];
}