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

Ios RestKit嵌套的一对多关系映射非常慢,ios,restkit,Ios,Restkit,在我从事的一些项目中,我注意到,当一对多关系嵌套在API响应中时,关系映射会花费很长时间,并在一些加载屏幕上造成瓶颈。我在instruments中描述了这个问题,没有一种方法脱颖而出,只有几种与关系映射相关的方法。即使未使用核心数据,此问题仍然存在。我想知道是否有任何设置、方法或属性可以用来加速关系映射过程 我创建了一个测试项目来突出这些问题。该项目有一个测试套件,它使用RestKit和OHttpStubs将一些json装置映射到自定义对象数组中。测试项目回购可在此处找到:。所使用的数据模型很简

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

我创建了一个测试项目来突出这些问题。该项目有一个测试套件,它使用RestKit和OHttpStubs将一些json装置映射到自定义对象数组中。测试项目回购可在此处找到:。所使用的数据模型很简单,但使用了一对多关系。它不使用核心数据。我将RestKit关系映射的结果与手动映射进行基准测试,只是作为一个参考点,我不希望关系映射像手动映射那样快


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

在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并不是简单地合并两个字典;它还合并了所有子词典。您的实现速度更快,但结果可能会有所不同。