我是Realm的新手,我已经看到this answer关于限制领域查询(在很多其他地方)。
我的问题是,当数据量变大时,以下代码花费的时间太长,无法将数据加载到数组中:
RLMResults* rlm = [[Item class] objectsWithPredicate:predicate]; // this loads fast
NSArray* results = [rlm valueForKey:@"self"]; // this is slow
据我所知,我也无法使用谓词来限制结果,所以我试图在领域网站中限制this example之类的结果,如下所示:
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时)调用工作很快。
我做错了吗?或者有没有办法更快地加载大量数据或限制结果?
非常感谢!
答案 0 :(得分:2)
就像它在Realm文档中所说的那样,RLMResults
的内容是延迟加载的。它是为了尝试推迟预加载而构建的。任何事情,直到绝对必要。当你遍历每个对象并将其添加到NSArray
时,它会强制每个对象延迟加载,这将(可以理解)导致性能下降。它也可能是大量的谓词查询也在懒惰地执行,这就是为什么当你访问结果集中的第一个对象而不是在你创建RLMResults
对象。
如果您认为这样做会导致性能下降是不可接受的,您可能需要考虑尝试不同的方法。例如,不是将对象复制到NSArray
,而是使用RLMResults
对象,并使用NSRange
对象仅跟踪所需的对象。此外,由于只有初始加载速度很慢,我还建议您尝试优化谓词查询,例如,确保您搜索的每个属性都已标记为已编入索引。
如果情况变得更糟,有时可能会有长时间的性能下降,如果是这样,您可以通过将其卸载到后台线程来缓解任何UI冻结。
我希望有所帮助!