StreamとかSignalなどの用語の意味はReactiveCocoa/Documentation/FrameworkOverview.md at master · ReactiveCocoa/ReactiveCocoa · GitHubに書いてある.
以下それらの用語まとめ
Stream (RACStream)
変化する一連の値(オブジェクト)を表す.値が変化する順番にしか取れない.
HaskellのモノイドとかMonadZipのような型クラスと同等のものを実装している.
Stream自体を直接使うことは少なく(RACStreamは抽象クラス),signalsやsequencesとして使うことが多い.
Signal (RACSignal)
push-drivenなstream.
処理が実行されたりデータを受け取ると,シグナルにより値が送られる(? 原文: "values are sent on the signal").値にアクセスするにはsignalをsubscribeする必要がある.
シグナルが送るイベントには以下の3種類がある
- next: ストリームから来た新しい値.値がnilになることもある
- error: シグナルが完了する前にエラーが起きたことを示す.イベントはNSErrorを含むかもしれない
- completed: シグナルが完了し,もう新しい値はstreamに追加されないことを表す.
シグナルはnextがn回後errorかcompletedが一度起きて終わる.(n=0~)
シグナル購読
購読者はシグナルからのイベントを待つ(待てる)何か.RACでは購読者はRACSubscriberプロトコルに準拠したオブジェクトなら良い.
購読は-subscribeNext:error:completed:などのメソッドで作成される.
シグナルが完了/エラー時に購読は破棄されるが,手動で止めることもできる(RACDisposable)
Subjects (RACSubject)
subjectは手で制御できるシグナル(mutableなシグナル).nextやcompleted, errorなどのイベントを自由に送れる.
RACでないコードとシグナルを利用したコードを繋ぐのに便利.例えばブロックの複数コールバック内でアプリケーションロジックを制御するかわりに,共有されたsubjectにブロック内からイベントを送るなど.
Commands (RACCommand)
何かのアクションへの反応としてトリガーされるシグナル.主にUI-drivenな操作で使う.例えばボタンがクリックされたときにsignalにより自動でdisableにする,など.
RACはNSButtonにrac_command
プロパティを付けてくれる
Connections (RACMulticastConnection)
connectionは任意の数の購読者と共有される購読(subscription)
シグナルはデフォルトでは購読されるたびに処理が走り,新しい値を取得するが,これは処理の種類によっては問題になる(例えばネットワークアクセスなどの重い処理).
(RACSignalの-publish
や-multicast:
メソッドで作られる)connectionは何度購読されても購読は1つだけ作成する.
そして一度接続されると(connectionのシグナルがhotになるという)全てのsubscriptionが捨てられるまではその唯一のsubscriptionを保持している(=新規にsubscriptionを作成することはしない)
Sequences (RACSequence)
pull-drivenなstream.Sequenceが持つ値は遅延評価され,またnilを含むことはできない.(NSArrayなどと同じ)
RACは-rac_sequence
メソッドをCocoaの各コレクションに追加してくれる.
Disposable (RACDisposable)
RACDisposableはキャンセルやリソースのcleanupのためのクラスだが,シグナルの購読解除に最もよく使われる.
subscriptionがdisposeされると,購読者は以降イベントを取得しない.またsubscriptionに関連する処理(ネットワークリクエストやバックグラウンド処理など)は全てキャンセルされる.
Schedulers (RACScheduler)
シグナルの連続した実行キュー
Value types
RACTuple
定数サイズのコレクション,nilを含むことができる
RACUnit
シングルトンな空value.steram内で使われる
RACEvent
任意のシグナルイベントを表す.
Foundation Support
Foundation classes向けのRAC-basedブリッジはフレームワークには入ってないので,使いたければRACExtensions
を使ってね