RxJava Realm findFirstAsync()结果未加载,findFirst()无休止地触发

时间:2016-06-02 13:55:36

标签: android realm rx-java

为什么这段代码无休止地执行它的.subscribe(..)部分?我假设在找到匹配的Content对象时,只会触发一次事件。但它一遍又一遍地开始。

realm.where(Content.class)
                .equalTo("keyID", id)
                .findFirst()
                .<Content>asObservable()
                .map(this::getPostFromContent)
                .subscribe(post -> {
                    loadComments(post.getId());
                });

如果我改为.findFirstAsync(),它会抛出异常: “无法访问尚未加载的行,请确保通过调用RealmObject.isLoaded()来加载实例”

我正在使用最新版本的域名。

更新

我能够通过使用:

来完成这项工作
realm.where(RealmWrappedContent.class)
                .equalTo("keyID", id)
                .findFirstAsync()
                .<RealmWrappedContent>asObservable()
                .filter(post -> post.isLoaded())
                .first()
                .map(this::getPostFromContent)
                .subscribe(post -> {
                    loadComments(post.getId());
                });

但是,为了将realm对象用作可观察对象,你需要编写太多东西。还有更好的办法吗?

1 个答案:

答案 0 :(得分:1)

默认行为是每次有更新时提交。在这种情况下,您需要使用filter/first来获取您发现的1个项目。

如果您想在整个应用中更改该行为,您还可以按照此处所述提供自己的RxObservableFactory实施:https://realm.io/docs/java/latest/#rxjava

默认工厂名为RealmObservableFactory,它应该相当容易包装或提供您自己的实现,以满足您对所有可观察对象的需求。