RxSwift勉強会＠Sansan まとめ

[RxSwift勉強会＠Sansan](http://connpass.com/event/27933/) に、はじめて「ブログまとめ枠」として参加しましたので、だいぶ遅くなって申し訳ございませんがまとめたもの公開します。

以下すでに先行して他の方がまとめたもの

- http://matome.naver.jp/odai/2146067615056021001
- https://blog.ppen.info/wp/?p=357
- http://blog.mogmet.com/rxswift-sansan/

またRxSwiftの予習が足りず、誤りがある場合はよしなに編集リクエストいただけると嬉しいです :bow: 

# RxSwiftをプロダクトに導入してみた話

## [@kazu0620](https://twitter.com/kazu0620?lang=ja)

https://speakerdeck.com/kazu0620/rxswiftwopurodakutonidao-ru-sitemitahua

- [Eight](https://itunes.apple.com/jp/app/eight-your-business-network/id444423637?mt=8)に導入した話
- 「さわったことある人、挙手」で参加者のうち多くの人が手を挙げていた模様（席の都合上良く見えなかった）
- 宣言的に記述できる => 「こういうものが流れてきて、こういう処理をする」ということを定義しておくだけ、状態変数はもたない
- **Rx**自体は枯れた技術で2009年からある
- "RxSwift"で検索してたときに情報が見つからなくても、"Reactive Extensions"だったり他の言語で調べると大量に情報が出てきたりする
- `Eight`ではAndroidが先行して`RxJava`を使っていて、そこの知見も活かせた
- RxSwift独自の機能（`RxCococa`や`Driver`、`Variable`）が便利
- UIKitのプロパティにbindingできるのは`RxCococa`によるもの
- `SubscribeOn`が勘違いしやすい
- 設計については`Clean Architecture`を参考にした

# 15 minutes recipe of RxSwift

## [@gomi_ningen](https://twitter.com/gomi_ningen)

http://niconare.nicovideo.jp/watch/kn1358

RxSwiftのObserverまわりを１５分でつくる話で、補足記事は[こちら](http://qiita.com/gomi_ningen/items/dc08a8a5514be9aa0eb2)

- Observerパターンの復習
- Observer, Observableの定義
- BehaviorSubjectの実装

### 実装のポイントと思われる箇所

- `push`型のObserverパターンを用いる
- Swiftのprotocolは、`generic type parameter`を持つことができない
- 型消去のパターン（`try! Swift`でも発表があったとのこと）で回避
- AbstractClassにしたいところは`@noreturn`を用いて回避
- unsubscribeにおけるオブジェクトの特定方法に、Swiftの`unsafeAddressOf()`を用いる（RxSwiftの`bag`でも用いられている）

### 補足

- http://qiita.com/omochimetaru/items/b41e7699ea25a324aefa

# Introduction to RxMarbleQuiz

## [@nakailand](https://twitter.com/nakailand)

http://niconare.nicovideo.jp/watch/kn1364

- オリジナルの図でRxMarblesを解説
- 数ある中で一番好きなオペレータは**combineLatest**
- http://rxmarbles.com/
- [RxQuiz](https://github.com/nakailand/RxQuiz)（Github）
- Rxのキャラの名前を作者のTwitterで聞いた => プロジェクト名は**Volta**と連絡がきた => プロジェクト名とキャラ名は同じでいいか聞いた => 返答なしとのこと

### 補足

- RxMarblesまとめアプリがツイートで紹介されていたので貼っておきます（[こちら](https://itunes.apple.com/jp/app/rxmarbles/id1087272442?l=en&mt=8)）

# Macアプリを作って憶えるRxSwift

## [@yimajo](https://twitter.com/yimajo)

https://speakerdeck.com/yimajo/macahuriwozuo-tuteyi-erurxswift

- RxSwiftでつくった「超実用的」Macアプリ（Github） => https://github.com/yimajo/MeetupTweet
- 「星をつけておくと忘れにくい」
- `rx_notification` = `NSNotification`の拡張で、`disposeBag`が使えるので、deallocなんかでnotificationのremoveをする処理は書かなくていい
- `rx_tap`だけど、`IBAction`で書きたいところは書いてもいいのでは
- 右から左に流れるツイートは`PublishSubject`
- （１つ前の発表で`merge`の使い道がわからないという話があったが）「ツイート」と「アプリからの情報通知」の２つのストリームをmergeしている
- 同じElementでないとmergeできないので同じプロトコルに揃える
- レイヤード風アーキテクチャ => 「モデル」という言葉の範囲が大きすぎる

## 補足

- 各種オペレータのうまい使い道（実践的なもの）まとめみたいなのがあったら面白いと思った

# RxSwiftのobserveOnとsubscribeOnを理解する

## [@ooba](https://twitter.com/ooba?lang=ja)

https://speakerdeck.com/bricklife/rxswiftfalseobserveontosubscribeonwoli-jie-suru

- observeOn/subscribeOn=実行スレッドを決めるもの
- オペレータ = ObserverとObservable両方の働きをする
- subscribeOnはObservable方向の`subscribe`の実行スレッドを決める
- observeOnはObserver方向の`on`の実行スレッドを決める
- subscribeOnが効かないケースもある
- `NSURLSession`の`rx_response`、`Hot`なobservable、`shareReply()`によってHot化されたobservableなど
- 自分がsubscribedOnしようとしていうものの性質を把握しておくことが重要
- 「挙動が理解できなければソースを読め」

### 補足 

- `Hot`と`Cold`をそもそも理解できていないので、とりあえずドキュメントを読まなくては（[こちら](https://github.com/ReactiveX/RxSwift/blob/master/Documentation/HotAndColdObservables.md)）。懇親会で複数人の人に訊いたが、言葉にするのは難しい＋人によっていろんな捉え方があるのかなと感じた

# Variableについて

## [@mo_to_44](https://twitter.com/mo_to_44)

（現時点で資料未公開）

- Rx勉強会を社内で１０回くらい朝に勉強会をした
- [Example](https://github.com/ReactiveX/RxSwift/tree/master/RxExample)とか基本的なオペレータみたりしたけど、「どういったことを解決できるのか」や「実践的なコード書いたほうが良かった」とのこと
- Variableについてはドキュメントとサンプルコードで勉強
- 日本語翻訳されたRxSwfitのDocumentもあったりする（[こちら](https://github.com/tid-kijyun/RxSwift/blob/translates-into-japanese/README-ja.md)）
- `someVariable.value = "hoge"`のように`value`に値を設定するとイベントが発行される
- `Variable`は`BehaviorSubject`をラップしたもの
- `BehaviorSubject`の特徴としては初期値を渡す必要がある
- 初期値の値、または直前の値をEventに流す
- 複数のsubscriberに対して同時に同じ値が流れる

## 補足

- `Variable`は`Unit`と呼ばれるものの１つで、`Unit`とは`RxCococa`限定のものでありオプション的（便利だよ的な？）な扱い。
- `Subject`には`BehaviorSubject`だけでなく`PublishSubject`や`ReplaySubject`というものもある模様

# RxTests

## [@_ishkawa](https://twitter.com/_ishkawa)

https://speakerdeck.com/ishkawa/rxtests

- Viewはデザインのリニューアルなんかで変わりやすい、でもViewModelは変わりにくい
- UIのテストは難しい、でもViewModelのテストならいける？
- 仮想時間 = `scheduler.scheduleAt(10) { /** ... */ }` にあたるところ
- **ライブコーディング!!!**
- 「ローディング」の表示のテスト
- 仮想時間には`TestScheduler`を使う
- ローディングを生成して、ViewModelのローディングにbindingして、最後にAssertする
- Assertの内容は、仮想時間が「0のとき=まだ何も起きていないとき」は`false`、「10のとき=refresh開始時」は`true`、「20=レスポンスを返ってきたとき」なので`false` みたいな感じでの検証

### 補足

- [桃の絵](https://github.com/ishkawa/talks/blob/master/2016-04-13-reactive-swift-meetup/img/Observable.png)を公開してくれたようです

# ブログまとめ枠の知見

- 予習はしっかり
- 写真は撮ろう（申し訳ございません）
- ブログまとめ枠っていつまでに公開しなくちゃいけないの？
- ブログまとめ枠専用席というのは少し恥ずかしかった、こういうもの？