我是Realm的新手,我已经看到了有关限制领域查询的答案(在很多其他地方)。
我的问题是,当数据量变大时,以下代码花费的时间太长,无法将数据加载到数组中:
RLMResults* rlm = [[Item class] objectsWithPredicate:predicate]; // this loads fast
NSArray* results = [rlm valueForKey:@"self"]; // this is slow
据我所知,我也无法使用谓词来限制结果,因此我尝试在领域网站中限制此示例的结果,如下所示:
RLMResults* rlm = [[Item class] objectsWithPredicate:predicate]; // this loads fast
NSMutableArray* results = [@[] mutableCopy];
for (NSInteger i = 0; i < 5; i++) {
Item* item = rlm[i]; // only the first call (when i == 0) is slow here
[results addObject:item];
}
因此,这里有趣的是,只有第一次调用rlm [i](rlm [0])会花很长时间,然后(当i> 0时)该调用会快速进行。
难道我做错了什么?或者有什么方法可以更快地加载大量数据或限制结果?
非常感谢!
就像Realm文档中说的那样,的内容RLMResults
是延迟加载的。它旨在尝试将“预加载”任何内容推迟到绝对必要之前。当您遍历每个对象并将其添加到中时NSArray
,这将迫使每个对象延迟加载,这(可以理解)会导致性能下降。也有可能谓词查询的大部分也被懒惰地执行,这就是为什么访问结果集中的第一个对象而不是创建RLMResults
对象时,性能会受到影响的原因。
如果您认为这样做对性能造成的影响是不可接受的,则可能要考虑尝试使用其他方法来解决此问题。例如,不要将对象复制到,而要NSArray
使用该RLMResults
对象,并仅跟踪要使用一个NSRange
对象的对象。此外,由于仅初始加载速度较慢,因此我还建议您也尝试优化谓词查询,例如,确保要搜索的每个属性都已标记为索引。
如果情况变得更糟,有时对长时间的性能下降无济于事,如果是这样,您可以通过将UI卸载到后台线程来减轻UI冻结的情况。
希望对您有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句