TaillookTech

モバイルアプリ開発を追っています

Swift RxSwiftのcombineLatestで情報フェッチ時のネストを回避する

問題

以前までこのような形で情報をフェッチしてビューに反映させてました
(この例ではViewとViewModelを分けたりとかしてませんが実際はいい感じに分けます)

    User.system.getMyPhoto({ (photo) in
      User.system.getMyName({ (name) in
        User.system.getMyID({ (id) in
          引数に3つの情報が必要ななんらかの処理
        })
      })
    })

これだとネストがいっぱいでイヤ!
(そもそも”引数に3つの情報が必要ななんらかの処理”が必要かという話は置いておいて...)

解決策

RxSwiftで値を監視しようぜという提案
こうします

  var photo = Variable<String>("")
  var name = Variable<String>("")
  var id = Variable<String>("")
  let bag = DisposeBag()

  User.system.getMyPhoto() { self.photo.value = $0 }
  User.system.getMyName() { self.name.value = $0 }
  User.system.getMyID() { self.id.value = $0 }
  Observable.combineLatest(photo.asObservable(), name.asObservable(), id.asObservable()) {photo, name, id in
    (photo, name, id)
    }.subscribe { event in
      引数に3つの情報が必要ななんらかの処理
    }.disposed(by: bag)

RxSwiftに詳しく無いので書き方はあってるかわかりませんが一応ネストを少なくできるかなといった感じです