RxJava在单个订户中观察多个观察者
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxJava在单个订户中观察多个观察者相关的知识,希望对你有一定的参考价值。
码
Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();
public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {
final boolean[] isJobSynchronized = {false};
Observable.fromIterable(mBooks)
.filter(Books::isChanged)
.doOnNext(book -> isJobSynchronized[0] = true)
.just(author)
.flatMapIterable(Author::getAllBooks)
.filter(MyBook::isChanged)
.doOnNext(mBook -> isJobSynchronized[0] = true)
.just(author)
.flatMapIterable(Author::getAllWriters)
.filter(Writers::isChanged)
.doOnNext(jobPage -> isJobSynchronized[0] = true)
.subscribe();
return isJobSynchronized[0];
}
问题
从静态参考fromIterable(mBooks)
调用Observable
但是从实例引用中调用just(author)
。
我只想在单个查询中完成此操作。我可以为每个人做出不同的观察并执行所需的操作,但这将是漫长的。
为什么?
通过这样做,SonarQube
给了我不成功的检查,并强迫我删除实例引用。
任何替代方案将不胜感激。
答案
这里没有理由使用RxJava,但运算符的正确组合如下:
Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();
public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {
return Single.concat(
Observable.fromIterable(mBooks)
.any(Books::isChanged)
, // ---------------------------------------------
Observable.fromIterable(author.getAllBooks)
.any(MyBook::isChanged)
, // ---------------------------------------------
Observable.fromIterable(author.getAllWriters)
.any(Writers::isChanged)
)
.any(bool -> bool)
.blockingGet();
}
另一答案
当它真的是一个可观察的时候,你试图使用just()
作为运算符。您的意图似乎是使用传入的author
进行一系列查询,然后检查与作者关联的任何书籍是否已“更改”。
此外,您尝试返回一个布尔值,该值可能在返回发生时未设置。如果需要值,可能需要阻塞并等待观察链完成。更有可能的是,如果任何书籍发生变化,您希望观察链完成。
此外,将标志设置为true的一系列步骤归结为第一次将标志设置为true
。
而不是使用just()
,使用map()
将原作者重新绑定到观察者链中。使用toBlocking()
运算符使进程同步。
Observable.fromIterable(mBooks)
.filter(Books::isChanged)
.toBlocking()
.subscribe( ignored -> isJobSynchronized[0] = true );
return isJobSynchronized[0];
由于(可能)异步查询不再需要计算值,因此删除RxJava:
return mBooks.stream()
.filter(Books::isChanged)
.anyMatch();
以上是关于RxJava在单个订户中观察多个观察者的主要内容,如果未能解决你的问题,请参考以下文章