7

ライブラリ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() は繰り返されません。

4

4 に答える 4