我在我的应用程序中使用了回收站视图,并希望在后台线程上进行一些计算,获取RealmObjects的列表,然后将其刷新为适配器.
作为背景知识,我对排序有一个微不足道的要求,并且回收者视图需要显示在不同表上查询产生的对象(尽管它们仍然产生相同的对象类型).我不想在主线程上执行这些潜在的昂贵查询.
做这个的最好方式是什么? AFAIK,我可以
>从后台线程获取ids(String)列表,并在主线程上进行查询.所以我会做一些诸如realm.where(ObjectA.class).in(listOfIds).findAll()的操作.但是,我不保证集合的顺序是我在后台排序的listOfIds的顺序.然后,我可以手动对领域集合进行排序.
>或者,假设我已经从后台线程获得了对象列表,那么我可以执行realm.copyFromRealm(listOfObjectA).通过这种方式,我感觉更干净,但是我显然失去了自动刷新功能,更不用说它将占用大量内存.似乎昂贵的复制将在主线程上进行,这将破坏我将内容移入后台线程的工作.
我希望有一种方法可以将RealmResults或RealmList从一个线程转移到另一个线程.有没有人对如何做到这一点有建议?
解决方法:
findAllSortedAsync
I have a non trivial sorting requirement
如果此排序纯粹基于您的RealmObject字段,则可以使用RealmQuery.findAllSortedAsync(…)方法,该方法将在单独的工作线程上执行查询和排序.这是最好的选择.如果可能的话,您还可以分两个阶段进行排序,一个阶段使用findAllSortedAsync,第二个阶段在已获得对象的主线程上进行-如果结果按领域进行预排序,第二阶段的成本可能不会那么高.
and the recycler view needs to display objects that result from queries on different tables
您可以寻找在这些对象之间创建链接的可能性,例如,如果RealmObject A具有字段b,则还可以按b的字段对A进行排序-这样可以解决您的问题,并将所有内容保留在一个领域查询中.
用已排序的ID重新查询(否)
Get a list of ids(String) from the background thread, and do a query on the main thread…
您是对的-无法保证以原始ID列表的顺序返回结果,因此,这不是真正的选择.
copyFromRealm
Or, I can do a realm.copyFromRealm(listOfObjectA)…
没错,但是您必须知道使用此方法的局限性和内存开销,即:
>您将获得数据快照,并且必须使用新快照手动更新回收站
>对符合原始查询的对象的单个更改将触发更新,并且有可能再次重新排序
It seems that the expensive copying would take place on the main thread, which would undermine my efforts to move things into the background thread.
并非如此,如果您在线程A上执行copyFromRealm并将列表传递给线程B,则将由线程A执行从领域的值的硬拷贝,因此很好.