RxJava 在单个订阅者中观察多个观察者
RxJava observe multiple observers in single subscriber
代码
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)
调用自 static-reference Observable
BUT just(author)
调用自实例参考。
我只想在单个查询中完成此操作。我可以为每个对象创建不同的可观察对象并执行所需的操作,但这会很长。
为什么?
通过这样做,SonarQube
给了我不成功的检查并迫使我删除 instance-reference.
任何替代方案将不胜感激。
您正试图将 just()
用作运算符,但它实际上是一个可观察的。看起来您的意图是使用传入的 author
进行一系列查询,然后检查与作者关联的任何书籍是否具有 "changed".
此外,您正在尝试 return 一个可能在 return 发生时尚未设置的布尔值。如果您想要该值,您可能需要阻塞并等待观察者链完成。更有可能的是,如果 any 本书已更改,您希望观察者链结束。
此外,将标志设置为 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,但是,正确的运算符组合如下:
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();
}
代码
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)
调用自 static-reference Observable
BUT just(author)
调用自实例参考。
我只想在单个查询中完成此操作。我可以为每个对象创建不同的可观察对象并执行所需的操作,但这会很长。
为什么?
通过这样做,SonarQube
给了我不成功的检查并迫使我删除 instance-reference.
任何替代方案将不胜感激。
您正试图将 just()
用作运算符,但它实际上是一个可观察的。看起来您的意图是使用传入的 author
进行一系列查询,然后检查与作者关联的任何书籍是否具有 "changed".
此外,您正在尝试 return 一个可能在 return 发生时尚未设置的布尔值。如果您想要该值,您可能需要阻塞并等待观察者链完成。更有可能的是,如果 any 本书已更改,您希望观察者链结束。
此外,将标志设置为 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,但是,正确的运算符组合如下:
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();
}