ReactiveX
https://raw.githubusercontent.com/ReactiveX/RxSwift/master/assets/Rx_Logo_M.png
背景知識
Observerパターン は、イベントの通知に適しており、古くから使われているデザインパターンと言えると思う。基本的には、イベントを発行する側 (Observable, Sbject 等と呼ばれる) がイベントを受け取った際に、受け取ったイベントを複数の対象 (Observer) に通知したい場合、Observable は Observer への参照を複数保持しておき、イベント発行時にそれら全てに一気にイベントの通知を行う。このように、イベントを受け取るオブジェクトがイベントの通知対象を複数参照して一気に通知する形式は、古典的な MVC (Classic MVC) にもみられる。Classic MVC では、Model が自身の変更を View と Controller の両方に通知するために、それらを dependencies として保持した。 また、このような形式を実現したい際には、Observable が複数の Observer の実装と密結合するのを防ぐために、最低限の I/F を実装した Observer インタフェースを参照させる。
https://gyazo.com/ffb8dc6809f9219e9a8fd4482f862de8
イテレータ
イテレータは、コンピュータプログラミングにおいては、配列等の Collection 型に対し、その保持する要素を順に走査する処理の I/F, 抽象である。例えば、Swift の場合だと、Sequence プロトコルに準拠した型がこの走査を行う能力を持つ。その定義は大体以下のようになっている。 code:swift
public protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
public protocol Sequence {
associatedtype Element
associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
func makeIterator() -> Iterator
}
Sequence プロトコルに適合している場合、for-in 文で簡単にイテレーションが行えるが、ここで簡略化されているロジックをしミューレションすると以下のようになる。makeIterator で返ってきたイテレータは、next を呼び出すことで次の要素を取得できる。これを nil が返ってくるまで続けることで、全ての要素を走査できる。
code:swift
var numbersIterator = numbers.makeIterator()
while let num = numbersIterator.next() {
print(num)
}
// Prints "2"
// Prints "3"
// Prints "5"
// Prints "7"
ReactiveX
ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.
It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety, concurrent data structures, and non-blocking I/O.
ReactiveX はイベントベースなプログラミングをサポートするライブラリになる。イベントといっても色々とあるが、特に GUI アプリケーションであれば、マウスのクリックやキーボードの入力なんかがイベントに当たる。アプリケーションはこれらのイベントをハンドリングする必要があり、そのイベントの通知のためには Observerパターンが活用できる。ReactiveX はこの Observerパターン を拡張したものとも説明されている。 Operators
オペレーター一覧は下記にあるし、どの Operator を使えば良いか?の指南もある。