RxSwift:シェア()、リプレイ()、shareReplayLatestWhileConnected()およびその他のクールな演算子について

RxSwiftのPublish、Connect、RefCountについてはすでに書いています トピックをよりよく開示するために、share()、replay()、replayAll()、shareReplay()、publish()、shareReplayLatestWhileConnected()などの演算子の違いに関する別の素晴らしい記事の翻訳を紹介します。



Rxの開発に着手している新規参入者が犯すよくある間違いは、Observableのオペレーターチェーンが新しいサブスクライバーごとに新たに実行されることを理解できないことです。



let results = query.rx.text .flatMapLatest { query in networkRequestAPI(query) } results.subscribe(...) //     results.subscribe(...) //  
      
      





単一のObservableに複数のサブスクライバーがありますが、新しいサブスクライバーごとにそのコードが実行されることは望ましくありません。 このためにRxSwiftにはいくつかの演算子があります。 以下に、それぞれについて説明した要約プレートを示します。



画像

1-bufferSizeよりもサブスクリプション前に生成されたアイテムはリレーしません。

2-少なくとも1つのサブスクライバーが存在する限り、サブスクリプションの前に作成された1アイテムを中継します。



次に、各プロパティを詳細に検討します



共有サブスクリプション。 返されたObservableは、すべてのサブスクライバー間で1つのプライマリサブスクリプションを共有します。



 let results = query.rx.text .flatMapLatest { query in networkRequestAPI(query) } .___() //        results.subscribe(...) results.subscribe(...)
      
      





接続可能 返されたObservableは、 connect()



メソッドが呼び出されるまで要素を生成しません。



参照カウント。 返されるObservableは、サブスクライブしているサブスクライバーの数をカウントします。 オペレーターが適用されたObservableの最初のプロパティから思い出すように(これをSource Observableと呼びます)、「メイン」サブスクリプションは常に1つだけであり、他のサブスクライバーとデータを共有します。



 let sourceObservable = query.rx.text .flatMapLatest { query in networkRequestAPI(query) } let resultObservable = sourceObservable.share() resultObservable.subscribe(...) resultObservable.subscribe(...) resultObservable.subscribe(...) //  sourceObservable        //        resultsObservable
      
      





サブスクライバカウントがゼロに達すると、ソース監視可能リソースがクリアされます。 注: カウンターが0から1に増加するたびに、Source Observableに新しいサブスクリプションが作成されます。 ただし、Source Observableがエラーを送信する前に完了した場合、またはエラーを送信した場合、これは発生しません。 これはかなり予測不可能な動作であるため、回避しようとしています。コードを記述するときは、サブスクライバーの数がゼロになった後、後続のサブスクリプションがないことを確認します。



イベントをリプレイします。 オペレーターは、Source Observableからエレメントを生成し始めた後にサブスクライブしたサブスクライバーに、Source Observableからエレメントを中継します。 replay(bufferSize)



およびshareReplay(bufferSize)



これらの要素shareReplay(bufferSize)



数はbufferSize以下です。 shareReplayLatestWhileConnected()



この数は1以下です。 shareReplay(bufferSize)



とは異なり、 shareReplayLatestWhileConnected()



は、サブスクライバーの数がゼロに減少するとバッファーをクリアします。 したがって、サブスクライバーが署名すると(カウンターを0から1にインクリメントする)、エレメントを受信しません。



また、 Subject



を使用する場合に役立つmulticast



演算子についても言及する価値があります。 ただし、この記事で説明する演算子は、ほとんどのユーザーの場合に十分である可能性があります。



翻訳者によるメモ。

完全を期すために、以下を読むことをお勧めします。

  1. RxSwiftのPublish、Connect、およびRefCountに関する記事では、上記の最初の3つのプロパティについて説明しました。
  2. RxSwiftオペレーターのチートシート 著者は素晴らしい仕事をして、すべての基本的なRxSwiftオペレーター、写真とコード例での説明を1か所に集めました。 オペレーターを思い出す必要がある場合は、チートシートを定期的に確認します。
  3. もちろん、RxSwiftの公式ドキュメントです。


不明な点がある場合は、コメントでお知らせください。



All Articles