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
してconnect
replayAll
、メモリ注意
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使いまくることになりそう。