Как улучшить код Rx Java для API и локального кэша? - PullRequest
0 голосов
/ 29 января 2020

У меня есть этот код, где я получаю фотографии из кэша, а затем мне нужно получить фотографии из API.

Disposable disposable = photosCacheRepository.getPhotoAttachments(workOrderId)
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(photoAttachments -> {
            Disposable disposable1 = workOrdersRepository.getWorkOrderDetails(workOrderId)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(workOrderDetails -> {
                  List<PhotoAttachment> photos = new ArrayList<>();
                  photos.addAll(photoAttachments);
                  photos.addAll(workOrderDetails.getAppointmentOccurrence().getPhotoAttachments());
                  if (photos.isEmpty()) {
                    view.displayNoWorkOrderPhotos();
                  } else {
                    view.displayWorkOrderPhotos(photos);
                  }
                });

            disposables.add(disposable1);
          });

      disposables.add(disposable);

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

1 Ответ

1 голос
/ 29 января 2020

Есть оператор Rx Java, который делает то, что вам нужно. Он называется flatMap ( Мрамор и информация об операторе здесь ).

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

Извините, я на самом деле не привык к java, поэтому следующий код почти уверен, что это не сработает, но просто чтобы сделать идею ...

В вашем примере вы могли бы сделать что-то вроде:

Disposable disposable = photosCacheRepository.getPhotoAttachments(workOrderId)
      .subscribeOn(Schedulers.io())
      .flatmap(photoAttachments -> {
         workOrdersRepository.getWorkOrderDetails(workOrderId)
            .map(workOrderDetails -> {
              List<PhotoAttachment> photos = new ArrayList<>();
              photos.addAll(photoAttachments);
              photos.addAll(workOrderDetails.getAppointmentOccurrence().getPhotoAttachments());
            return photos;
            .ObserveOn(AndroidSchedulers.mainThread())
            .subscribe(photos -> {
              if (photos.isEmpty()) {
                view.displayNoWorkOrderPhotos();
              } else {
                view.displayWorkOrderPhotos(photos);
              }...

Надеюсь, это поможет, хотя бы немного:)

...