tomoyasuzuki / TaskShare

0 stars 0 forks source link

RxSwift + RxCocoaに関する基礎知識 #2

Open tomoyasuzuki opened 5 years ago

tomoyasuzuki commented 5 years ago

Hot & Cold

Subject類はHot. OperatorはCold. HotなObservableはSubscribeされないでも動作する(値を受け取る) ColdなObservableはSubscribeされないと動作しない(値を受け取らない) Hotは前のColdを稼働させる ColdなObservableは複数のObserverを持てない(持つとその分不要なストリームを通す) HotなObservableは複数のObserverを持てる HotなObservableはイベントを各Observerで共有する →一度流れたイベントは再び流れない。 https://www.slideshare.net/yukitakahashi3139241/hot-64131190?next_slideshow=1

tomoyasuzuki commented 5 years ago

Hot変換

ConnectableObservableはconnectされるまでイベントを受け取らない。 Share.Shareは内部でrefCountしており、これはConnectableObservableに対して呼べるOperator. こいつを入れるとHotの基本であるSubscribeしないでも動作する(イベントを受け取る)からすこし変わって最初にSubscribeされるまで動作しない、になる。内部的にsubscribeが1の時にconnectしているだけ。

Operator

基本的にcreate,justなどのcreate系Operator以外のOperatorは ・内部でSourceをSubscribe ・加工して流す をしている。

Subject、Relay

Subjectは三種類のイベントを流すことができ、RelayはonNextだけ。 Behavior系はSubscribe時に過去の値を1つ受け取ることができる。 ・Subjectはエラーによって処理を分岐したい時 ・RelayはUIのバインドなどエラーを無視して値だけ流したい時 https://qiita.com/atizawa/items/0d872198d93403dc82a8

tomoyasuzuki commented 5 years ago

share(replay: 1)

replayはHOT変換するためのメソッドのひとつ。 share(replay: 1)みたいな感じで使える。 shareReplayは廃止されたみたい。 Hot変換ではConnectableObservableに変換しているので、replayも通常のColdなObservableをConnectableObservableに変換している。 ただConnectableObservableというのは厳密なHOTの定義からはやや外れて、 ・最初にsubscribeされるまで動作しない という状態になっている。 そのため、shareだけだとダメで、refCount()してやらないといけない。 Hot変換するときは基本的にはこいつを使ってやらないといけないと思う。

tomoyasuzuki commented 5 years ago

Driver, Signal, Replayについて

まあまずはざっくりとDriverについてはわかる。 DriverはそもそもSharedSequence(こいつがちょっと理解が浅い)であり、RxSwift独自のもの。 そのため、メソッドチェインの際に制約があったりメモリ消費の観点で問題があったりするらしい。 基本的な ・エラー流さない ・メインスレッド保証 などは押さえておく。 SignalはreplayしないDriver。 つまり、subscribeされる前にemitされたitemを保持しておく機能があるかどうか?意外にもrelayも関連してくるみたい。 Relayは基本的にエラーを流さないsubjectってだけ。 ただBehavior系は初期値を持つ。Publishは持たない。 またBehaviorRelayはasDriverしかできないし、PublishRelayはasSignalしかできない。 つまりBehaviorRelayではreplayしたいし、PublishRelayではreplayしたくない。

http://reactivex.io/documentation/operators/replay.html https://qiita.com/morishin/items/fbbb71d6b49f89d33b98

tomoyasuzuki commented 5 years ago

メソッドチェインで気をつけること

基本的にクロージャ内で外部変数をキャプチャするときは循環参照を避けるために弱参照する。 どうやらRxSwiftのOperatorではunownedでも問題ないみたいだけどまだ理解できていないのでweakにしておく。 そもそもクロージャで外部変数をキャプチャしないほうが望ましいので、そこがそもそもの過ちな説はある。オペレータ内で常に外部変数をキャプチャするようなコードは出来るだけ書かないほうがいい。ただそこを意識しつつコード書けるかと言われると微妙なので何かtipsなどあると嬉しい。 https://qiita.com/susieyy/items/39efd4d34cf4c1f9d3ef

tomoyasuzuki commented 5 years ago

https://qiita.com/_ha1f/items/e16ddc6017c4ad807c3c