Observable
- ObservableクラスはRxフレームワークの基礎であり、observableシーケンスと呼ぶことができます。つまり、Observableオブジェクトはevent(element : T)のようなイベントを不定期に生成します。
- これらのEventはデータを運ぶこともでき、そのジェネリックタイプはEventが運ぶデータのタイプを指定するために使用されます。
- Observableシーケンスでは、それをサブスクライブするObserverも必要で、このサブスクライバはObservableが時々送信するEventを受け取ることができます。
Event
public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
- next:次のイベントはデータを運ぶことができるイベントなので、「最も普通の」イベントと言えます。
- error:エラーイベントはエラーを表し、特定のエラー内容を持つことができます。一度Observableがエラーイベントを発すると、Observableは終了し、二度とイベントイベントを発することはありません。
Observableシーケンスの作成
- just()
let observable = Observable<Int>.just(5)
- of()
let b = Observable.of('A', 'B', 'C');
- from()
let obj = Observable.from([
'A',
'B',
'C'
]);
- empty()
let observable = Observable<Int>.empty()
- never()
let observable = Observable<Int>.never()
- error()
enum MyError: Error {
case A
case B
}
let observable = Observable<Int>.error(MyError.A)
- range()
//range() を使用する
let observable = Observable.range(start: 1, count: 5)
//of()を使う
let observable = Observable.of(1, 2, 3 ,4 ,5)
- repeatElement()
let b = Observable.obj(0x1);
- generate()
//generate()メソッドを使う
let observable = Observable.generate(
initialState: 0,
condition: { $0 <= 10 },
iterate: { $0 + 2 }
)
//of()メソッドを使う
let observable = Observable.of(0 , 2 ,4 ,6 ,8 ,10)
- create()
//このブロックには、コールバック・パラメーターobserverがあり、これはObservableオブジェクトのサブスクライバーである。
//サブスクライバーがこのObservableオブジェクトをサブスクライブすると、サブスクライバーは何かを実行するためのパラメータとしてブロックに渡される。
let observable = Observable<String>.create{observer in
//購読者に発行される.nextイベントに参加し、データを運ぶ。"hangge.com"
observer.onNext("hangge.com")
//購読者に発行される.completed
observer.onCompleted()
//サブスクリプションのビヘイビアはディスポーザブル型の戻り値を持つので、必ずディスポーザブルを
return Disposables.create()
}
//サブスクリプション・テスト
observable.subscribe {
print($0)
}
- deferred()
//奇数または偶数をマークするのに使う
var isOdd = true
//Deferred()メソッドを使用して、ブロックを渡してObservableシーケンスの初期化を遅らせ、それを返す。
let factory : Observable<Int> = Observable.deferred {
//ブロックが実行されるたびに、奇数と偶数を交互に繰り返すようにする。
isOdd = !isOdd
//isOddパラメータによって、Observableが奇数か偶数かを決定する。
if isOdd {
return Observable.of(1, 3, 5 ,7)
}else {
return Observable.of(2, 4, 6, 8)
}
}
//第1回加入テスト
factory.subscribe { event in
print("\(isOdd)", event)
}
//第2回加入テスト
factory.subscribe { event in
print("\(isOdd)", event)
}
- interval()
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.subscribe { event in
print(event)
}
- timer()
//5数秒後、唯一のエレメント0が放出される
let observable = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
observable.subscribe { event in
print(event)
}
//5秒の遅延の後、1秒ごとにエレメントが放出される。
let observable = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)
observable.subscribe { event in
print(event)
}