【Swift】RxSwift②の0->1
参加プレイヤーのスイッチの値をまとめて監視するには
まずはスイッチをobservableにしないといけない
let observable = textField.rx.text.asObservable()
これを書けばとりあえずなるのか?
でオブザーバブルになると
onNextは「値が更新された」, onCompletedは「処理が完了した」, onErrorは「エラーが発生した」というイベントを表します。onNextは値を渡すことができますが、onCompletedは値を渡すことができません。
ふむふむ
一度onCompletedやonErrorが発生するとそれ以降onNext等を呼ぶことはできなくなるので注意(複数のonCompletedが必要な場合は、それぞれをObservableにするか、onNextとして流す)
subscribe処理をいつまでも続ける訳にはいきません。これを止めることをdisposeと呼びます。クロージャなどがメモリ解放されます。
onCompletedやonErrorが発生するとObservableはもうイベントを発行できないので、自動的にdisposeされます。よって、明示的にdisposeする必要はありません。disposeは適切に行わないと、メモリリークします。が、一つ一つ開放処理を書くとバグが発生しやすいです。そこで、DisposeBagを使うと半自動的に解放をしてくれるのでよく使います。
注意しなければならないのは、購読処理の中のclosureでself等を強参照すると解放されなくなってしまうので、 weak または unowned にしなければいけないことです。
基本的には、closureが実行される段階ではdisposeBagがdisposeされていない、すなわちselfも存在しているはずなので unowned で問題ないと思いますが、中で更に非同期処理を実行している場合などは注意が必要です。
Subjectを使うと、より複雑なObservableを作ることができます。
private let subject = PublishSubject<String>()
// getter
public var observable: Observable<String> {
return subject.asObservable()
}
func run() {
subject.onNext("foo")
subject.onCompleted()
}
えっflatMapがすごいらしい
self.button.rx.tap
.flatMap { [weak self] event in self?.fetchData() }
.flatMap { [weak self] data in self?.fetchUser(data.userId) }
.subscribe(onNext: { [weak self] user in
self?.label.text = data2.title
})
.disposed(by: self.disposeBag)
確かにこれはすごい