blog

RxSwift は -Observable を使用します。

ObservableクラスはRxフレームワークの基礎であり、observableシーケンスと呼ぶことができます。つまり、Observableオブジェクトは、時間をかけて不規則な間隔でevent(ele...

Jun 18, 2020 · 4 min. read
シェア

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シーケンスの作成

  1. just()
let observable = Observable<Int>.just(5)
  1. of()
let b = Observable.of('A', 'B', 'C');
  1. from()
let obj = Observable.from([
    'A',
    'B',
    'C'
]);
  1. empty()
let observable = Observable<Int>.empty()
  1. never()
let observable = Observable<Int>.never()
  1. error()
enum MyError: Error {
 case A
 case B
}
 
let observable = Observable<Int>.error(MyError.A)
  1. range()
//range() を使用する
let observable = Observable.range(start: 1, count: 5)
 
//of()を使う
let observable = Observable.of(1, 2, 3 ,4 ,5)
  1. repeatElement()
let b = Observable.obj(0x1);
  1. 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)
  1. 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)
}
  1. 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)
}
  1. interval()
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.subscribe { event in
 print(event)
}
  1. 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)
}
Read next