Код

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 НО just(author) вызывается из instance-reference .

Я хочу выполнить эту операцию только одним запросом. Я могу сделать разные наблюдаемые для каждого и выполнить желаемую операцию, но это займет много времени.

Почему?

Поступая так, SonarQube дает мне неудачную проверку и вынуждает меня удалить instance-reference .

Любые альтернативы будут оценены.


Lint analysis

1
Aks4125 1 Янв 2018 в 13:02

2 ответа

Лучший ответ

Здесь нет причин использовать 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();
}
0
akarnokd 2 Янв 2018 в 12:29

Вы пытаетесь использовать just() в качестве оператора, когда это действительно наблюдаемое. Похоже, вы намерены использовать переданный в author ряд запросов, а затем проверить, что все книги, связанные с автором, "изменились".

Кроме того, вы пытаетесь вернуть логическое значение, которое, вероятно, не было установлено к моменту возврата. Вам может потребоваться заблокировать и дождаться завершения цепочки наблюдателей, если вы хотите получить значение. Скорее всего, вы хотите, чтобы цепочка наблюдателей завершилась, если какая-либо книга изменилась.

Кроме того, последовательность шагов, на которых вы устанавливаете флаг в истинное значение, сводится к установке флага на 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();
1
Bob Dalgleish 1 Янв 2018 в 15:38