【问题标题】:RxJava Realm findFirstAsync() result is not loaded, findFirst() fires endlesslyRxJava Realm findFirstAsync() 结果未加载,findFirst() 无限触发
【发布时间】:2016-06-02 13:55:36
【问题描述】:

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

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());
                });

但是为了将领域对象用作可观察对象,您需要编写的东西太多了。有没有更好的办法?

【问题讨论】:

  • 我假设您在第一种情况下每次底层领域发生变化时都会收到一个事件,顺便说一句,请阅读docs on using asObservable()

标签: android realm rx-java


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 2014-11-14
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2020-10-08
    相关资源
    最近更新 更多