RxSwift本 2週目
一通り目を通しました。メモはとても雑になってしまいましたが。
最後のTODOアプリを参考に何か作ろうと思ったのですが、構造が苦手な感じだったので、 データフローはReSwift(Redux)で、RxSwiftは便利なbindユーティリティとして使う感じでアプリを作ってみています。
5章
skipは指定要素まで飛ばすskipWhileはtrueの間流れてこないskipUntilはtriggerがonNextされるまでtakeも同じような感じdistinctUntilChangedは値が変わった時だけignoreElementsは何も流れて来なくなるelementAt(_:)は指定インデックスの要素filter(_:)は汎用
6章
- Observableを共有したい時は
shareを使う ignoreElementsしてcompletedかerrorのときだけ処理filterでユニークな画像だけにするtakeWhileで個数制限- カメラロールへのアクセス許可をいい感じにコントロール
- エラー表示のAlertをOvservableでハンドリング
SchedulerでAlertを自動で閉じるthrottleで無駄な処理をやめる
7章
toArrayで配列にできるflatMapでStrudentのscoreを監視flatMapLatestなら最後に設定されたStudentのscoreだけ監視
8章
flatMapでrequestをobservableにしてresponseを待つ- 1回しか実行したくないものは
shareReply(1)で flatMapでnilなevent除外、neverも除外
9章
startWithでprefix、justとconcatを組み合わせても同じことできるmergeしたやつ全部がcpmpletedになったら終わるcombileLatest、zipで要素をまとめるwithLatestFrom、button押したらtextFieldの値をswitchLatestで切り替えscanでreduceの過程を
10章
bindToでAPIの結果をvariableに- openとclosedなAPIの結果を
concatで - categoryとeventのAPIを
combineLatestで - mergeを使ってopenとclosedを並列ダウンロード、
maxConcurrentでサーバ負荷おさえる scanでインクリメンタルにUIを更新
11章
- 時間を扱うオペレータいろいろ
replayしてconnectreplayAll、メモリ注意
12章
- ApiController.sharedで天気を取得してobservableに
- searchFieldの
rx.textが変化したときにも呼び出す - searchを
flatMapLatestで再利用可能にしてbindTo - Driverとdrive使う、onErrorJustReturn
- controlEventでDidEndのときだけ処理する
- AcitivyIndicatorとかProgressBarにbindToできるやつ用意されてる
13章
- mergeでローディング状態を表示、startWithで初期表示を簡単に
- CCLocationManagerをいい感じに
- MapViewも
- 描画しすぎて遅くなるようなら何らかのdiff alogorithmで最適化しないとかも
14章
catchErrorでエラーの時は前回のキャッシュ返したりretry(3)などでエラーの時にリトライ -retryWhenで条件とか詳細にしたりできる
15章
- subscribeOn, observeOnでスレッド指定
- HTTPリクエストとかファイル出力とか副作用があるやつはcold observable(not shared)、subscribeされるまでなにもおきない
16章
- テスト
- RxTest(旧RxTests)、RxBlocking
- ViewModelのテスト
17章
- URLSessionをいい感じに、テストも
- RxDataSource、tableViewなどに
- RxAlamofire, RxBluetoothKit
18章
- Observableつくってitemsにbind
- modelSelectedでタップ
- ちょっとコード足せば複数のセルタイプも行ける
- setDelegateもできる
- RxDataSources使えばもっと便利に。差分やアニメーション
19章
- アクション
- login、passwordをcombileLatest
- loginButtonがそれをwithLatestFromして、loginActionにbind
- これでログインボタンを押したらログイン走る(終わるまで次は実行されない)
- loginActionをsubscribeして成功したら次のViewをpushするなど
- executeで手動発火もできる
20章
- tapGesture, anyGesture, when(.recognized)とかでお手軽に
21章
- RxRealm
22章
- RxAlamofire
23章
- ViewModel以下の階層はiOS, Macで共通
- navigationItemのclickとかもsubscribeで
24章
- TODOアプリ
参考
ReSwiftのステートをRxSwiftを使って監視する - A Day In The Life
ReSwiftのAppStateをObservableに
今日こそ理解するHot / Cold @社内RxSwift勉強会
mapやfilterなどほとんどのオペレータはcold。subscribeされるまで動作しない。 coldは分岐できないので、sequenceが2つになる。 hotに変換すると同じsequenceを共有できる。
今日こそ理解するHot変換
publishやreplyはConnectableObservableを返す。 connect呼ぶまでは動作しない。 shareは内部でrefCount呼ぶ。subscribeされたらconnectする。subscribeされるまで動作しないhot。 shareReplay、shareしつつ指定個数だけbuffer。 shareReplayLatestWhileConnected、connect中しかreplayされない。completedになったらずっとcompleted。
RxSwiftと愉快な仲間たち / RxSwift with Units // Speaker Deck
Driverは、エラー流れない・メインスレッドでobserve・shareReplayLatestWhileConnected。 Observableでもできるが、UIにbindする時によくやることをまとめてくれている。
今作ってるアプリだとDriver使いまくることになりそう。