Closed2

【Swift】RxSwift②の0->1

yoshitakayoshitaka

参加プレイヤーのスイッチの値をまとめて監視するには

まずはスイッチを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 で問題ないと思いますが、中で更に非同期処理を実行している場合などは注意が必要です。

yoshitakayoshitaka

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)

確かにこれはすごい

このスクラップは2021/06/01にクローズされました