领域限制查询结果

时间:2016-05-19 15:06:33

标签: ios objective-c realm

我是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时)调用工作很快。

我做错了吗?或者有没有办法更快地加载大量数据或限制结果?

非常感谢!

1 个答案:

答案 0 :(得分:2)

就像它在Realm文档中所说的那样,RLMResults的内容是延迟加载的。它是为了尝试推迟预加载而构建的。任何事情,直到绝对必要。当你遍历每个对象并将其添加到NSArray时,它会强制每个对象延迟加载,这将(可以理解)导致性能下降。它也可能是大量的谓词查询也在懒惰地执行,这就是为什么当你访问结果集中的第一个对象而不是在你创建RLMResults对象。

如果您认为这样做会导致性能下降是不可接受的,您可能需要考虑尝试不同的方法。例如,不是将对象复制到NSArray,而是使用RLMResults对象,并使用NSRange对象仅跟踪所需的对象。此外,由于只有初始加载速度很慢,我还建议您尝试优化谓词查询,例如,确保您搜索的每个属性都已标记为已编入索引。

如果情况变得更糟,有时可能会有长时间的性能下降,如果是这样,您可以通过将其卸载到后台线程来缓解任何UI冻结。

我希望有所帮助!