java - Realm Java 排序使 changelistener 变慢
问题描述
当我有一个包含更多元素(大约 7000 个)的列表并且我向查询添加排序时,更改侦听器变得非常慢。当只给出一个字段时,情况并非如此。从第二个领域开始,它慢了很多。它似乎还取决于排序的字段类型。布尔值似乎相当快。仅使用一个时,日期也会变慢。
让我向您展示我的工作:对具有多个排序元素的所有对象进行非常简单的查询:
val theList = realm.where(TheObject::class.java)
.sort(
arrayOf("fieldBool", "fieldDate", "fieldString"),
arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
)
.findAllAsync()
theList.addChangeListener { result: RealmResults<TheObject> ->
// Set the list to the view.
}
现在,当此结果列表中的某个对象发生更改时,更改侦听器需要大量时间来更新数据。同一个looper上的其他变化监听器也很慢。
即使我在添加 changeListener (在更改 lsitener 中)后对结果进行排序:
val theList = realm.where(TheObject::class.java)
.findAllAsync()
theList.addChangeListener { result: RealmResults<TheObject> ->
viewToSet.list = result.sort(
arrayOf("fieldBool", "fieldDate", "fieldString"),
arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
)
}
更新发生得很慢。我发现它可能与计算变更集有关。如果我将 changelistener 添加到领域而不是结果,它的工作速度非常快。仍然有趣的是,我没有将 changeListener 添加到排序列表,而是添加到未排序列表。排序然后在侦听器内部运行得非常快,但是一旦我在某个地方有一个排序的 RealmResults ,变更集的创建似乎需要一段时间......
这是一个错误还是只是 Realm 的一个弱点?
解决方案
问题是领域中两个边缘案例/错误的组合:
RealmResult
在创建变更集时会考虑每个人的错误,即使RealmResult
它本身没有侦听器(请参阅https://github.com/realm/realm-java/issues/6614)。- Realm 有一个边缘情况,当一个对象具有循环引用 (
ObjectA -> ObjectB -> RealmList<ObjectA>
) 被提取到一个列表中并且该列表被排序时,变更集的创建需要很长时间。
我通过删除循环参考来解决这个问题。现在它起作用了。
推荐阅读
- c++ - 检测指针目标:静态内存还是动态内存?
- c - 如何使用 strtol 从用户输入中提取数字
- python - 在 Python 中解析日期时混淆日期和月份
- python-3.x - 我不知道如何编写一个猜词程序的一部分
- sabre - SABRE RedWeb 安装/入门
- spring - @Transactional 注解不回滚
- mysql - 创建具有主键和不同列值的视图会产生奇怪的结果
- typescript - vue-class-component + typescript:如何在导入的函数中使用组件的类作为“this”的类型?
- python - Discord py - 我怎样才能停止我的调度程序两次执行任务?
- excel - Excel VBA 代码适用于 Windows 10,但不适用于运行 macOS Catalina 10.15.7 和 Excel for Mac 版本 16.43 的 MacBook Pro