Realm Java 排序使 changelistener 变慢

Realm Java sorting makes changelistener slow

当我有一个包含更多元素(大约 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.
}

现在,当此结果列表中的某些对象发生更改时,更改侦听器需要大量时间来更新数据。同一个循环器上的其他更改侦听器也非常慢。

即使我在添加 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 添加到排序列表中,而是添加到未排序列表中。排序然后在侦听器内部工作得非常快,但是一旦我在某个地方有一个排序的 RealmResults,变更集的创建似乎需要一段时间......

这是一个错误还是 Realm 的弱点?

问题是领域中两个 Edgecases/Bugs 的组合:

  1. 创建变更集时每个活着的 RealmResult 都会被考虑在内的错误,即使 RealmResult 本身没有侦听器(请参阅 https://github.com/realm/realm-java/issues/6614)。
  2. 当在列表中获取具有循环引用 (ObjectA -> ObjectB -> RealmList<ObjectA>) 的对象并对该列表进行排序时,Realm 有一个边界情况,变更集创建需要很长时间。

我通过删除循环引用解决了这个问题。现在可以了。