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

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

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

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

【问题讨论】:

    标签: ios 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 不是简单的合并两个字典;它也合并了所有子词典。您的实施速度更快,但结果可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多