在我正在开展的一些项目中,我注意到当一对多关系嵌套在API响应中时,关系映射需要很长时间并导致一些瓶颈加载屏幕。我在工具中描述了这个问题,并没有一个突出的方法,只有几个与关系映射相关的方法。即使未使用核心数据,此问题仍然存在。我想知道是否有任何设置,方法或属性可以用来加速关系映射过程。
我创建了一个测试项目来突出问题。该项目有一个测试套件,它使用RestKit和OHHTTPStubs将一些json灯具映射到一个自定义对象数组中。可以在此处找到测试项目仓库:https://github.com/rtimpone/restkit_relationship_mapping_benchmarking。使用的数据模型很简单,但使用了一对多的关系。它不使用核心数据。我将RestKit关系映射的结果与手动映射作为参考点进行基准测试,我不希望关系映射与手动映射一样快。
在设置RestKit或对象映射时,我能做些什么来使关系映射更快?在设置我的映射或响应描述符时是否缺少一些步骤?映射嵌套关系时,此性能是否典型?任何有关此主题的帮助或建议将不胜感激。
答案 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];
}