ライブラリRxSwiftを学習しようとしています
次のようなコードがあります。
if data.checkAllIsOk()
{
[do things]
}
else
{
[show alert]
}
チェックする前にサーバーからデータを更新する必要があるため、Observable を返す getData() をモデル化しました。
私の現在のアプローチはこれです:
getData()
>- flatMap{ (data:Data) -> Observable<Bool> in
_=0 // workaround for type inference bugs
return just(data.checkAllIsOk())
}
>- subscribeNext{ (ok) -> Void in
if ok
{
[do the things]
}
else
{
[show the alert]
}
}
>- disposeBag.addDisposable()
それは機能します(または、そうすべきです、私はまだ書いています)が、それは間違っているように感じます..もっと「反応的」な方法はありますか?使用する最も適切な演算子は何ですか?
「false」に対してエラーを返し、catch ブロックを使用する可能性はありますか?
アップデート
ssrobbi によって提案されたアプローチに従って、2 つのブランチを 2 つの異なる subscribeNext に分割し、フィルターを使用して正または負のブランチを選択しました。結果のコードは次のとおりです。
let checkData=getData()
>- flatMap{ (data:Data) -> Observable<Bool> in
_=0
return just(data.checkAllIsOk())
}
>- shareReplay(1)
}
[...]
checkData
>- filter{ (ok) -> Bool in
ok == true
}
>- subscribeNext{ (_) -> Void in
[do the things]
}
>- disposeBag.addDisposable()
checkData
>- filter{ (ok) -> Bool in
ok == false
}
>- subscribeNext{ (_) -> Void in
[show the alert]
}
>- disposeBag.addDisposable()
このアプローチの利点は、サブスクライブ本文を書き直すことなく、コードの他の部分で 2 つのブランチのうちの 1 つだけを再利用できることです (重複が少ないことは常に良いことです!)
アップデート
RxSwift slack での議論の後、shareReplay(1) を追加したので、getData() は繰り返されません。