RxSwift Chaining: Как лучше написать это в Rxswift? - PullRequest
0 голосов
/ 19 февраля 2019

Я очень новичок в RxSwift.Очень новыйОбычно, чтобы связать вас без Rx, вы помещаете следующую функцию в замыкание завершения.Мои коллеги сказали мне использовать flatmap или нашу версию concatmap, но никогда не приводили мне пример.Кто-нибудь может конвертировать этот код с помощью flatmap или быстрой версии concatmap?Опять же, я очень новичок, поэтому, пожалуйста, будьте осторожны с суждениями.

 SVProgressHUD.show()
    params.address = address
    print(params)
    viewmodel
      .postSeekerAvatar(image: image).subscribe(onSuccess: {
//        SVProgressHUD.dismiss()
//        SVProgressHUD.show()
        self.viewmodel
          .updateSeeker(withFirstName: params.firstName, lastName: params.lastName, isBusiness: params.isBusiness, abn: "none", address: params.address)
          .subscribe(onSuccess: {
            SVProgressHUD.dismiss()

        self.performSegue(withIdentifier: SegueConstants.toProfileForm, sender: self)

      }) { (error) in
        SVProgressHUD.showDismissableError(with: error.message)
      }.disposed(by: self.disposeBag)
  }) { (error) in
    SVProgressHUD.showDismissableInfo(with: error.message)
  }.disposed(by: disposeBag)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Итак, вы хотите, чтобы никогда не было вложенных subscribe вызовов.Вместо этого вы преобразуете исходные наблюдаемые значения, иногда в другое значение, в другое время с другим наблюдаемым.

SVProgressHUD.show()
params.address = address
print(params)
viewmodel
  .postSeekerAvatar(image: image)
  .flatMap {
    self.viewmodel
      .updateSeeker(withFirstName: params.firstName, lastName: params.lastName, isBusiness: params.isBusiness, abn: "none", address: params.address)
  }
  .subscribe(onSuccess: {
    SVProgressHUD.dismiss()
      self.performSegue(withIdentifier: SegueConstants.toProfileForm, sender: self)
   }, onError: { (error) in
      SVProgressHUD.showDismissableError(with: error.message)
   })
  .disposed(by: disposeBag)

Итак, здесь сначала будет подписан postSeekerAvatar, и каждый раз, когда оно выталкивает значение,updateSeeker также будет подписан на.Если какая-либо из них выдаст ошибку, будет выполнено ее закрытие.

0 голосов
/ 19 февраля 2019
postSeekerAvatar() method should return a Single response 
Add showLoader/hideLoader method in BaseViewController. 

viewmodel
    .postSeekerAvatar(image: image) //Return Single<Response>
    .do(onSubscribed: presenter.showLoader)
    .do(onDispose: presenter.hideLoader)
    .asCompletable()
    .andThen(update(params: params))
    .subscribe()
    .disposeOnDeactivate(interactor: self)

//Returns a completable 
  private func update(params: Model) -> Completable {
    viewmodel
      .updateSeeker(
        withFirstName: params.firstName,
        lastName: params.lastName,
        isBusiness: params.isBusiness,
        abn: "none",
        address: params.address
    )
    return Completable.empty()
  }
...