【Swift】RxSwift勉強してみたPart3


はじめに

前回に引き続き、RxSwiftを勉強したので、その学習アウトプットです。
RxSwiftでHello World的なものを書いてみます。

GitHub

以下のHelloRxSwiftフォルダに今回のプロジェクトはあります。

実装

流れは以下の通りです。
1.HelloWorldSubjectというSubjectを定義
2.Subjectを購読
3.値が流れてきたらprintで値を出力されるように定義
4.定義したクラスが破棄されたら購読も自動的に破棄させる
5.N回イベントをながす
6.定義したクロージャがN回実行される

viewDidLoadでこのように書いてみます。

import UIKit
import RxSwift

class HelloRxViewController: UIViewController {

    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let helloWorldSubject = PublishSubject<String>()
        helloWorldSubject.subscribe(onNext: { message in
            print("onNext: \(message)")
        }, onCompleted: {
            print("onCompleted")
        }, onDisposed: {
            print("onDisposed")
        })
        .disposed(by: disposeBag)

        helloWorldSubject.onNext("HelloWorld!")
        helloWorldSubject.onCompleted()

    }
}
出力結果
//onNext: HelloWorld!
//onCompleted
//onDisposed

このような書き方はViewControllerViewModelや遷移元と遷移先のViewControllerのデータの受け渡しで使われます。
次はViewControllerViewModelに分けて書いてみます。

HelloRxViewController
import UIKit
import RxSwift

class HelloRxViewController: UIViewController {

    private let disposeBag = DisposeBag()
    private let viewModel = HelloRxViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

        viewModel.helloWorldObservable
            .subscribe(onNext: { message in
                print("onNext: \(message)")
            }, onCompleted: {
                print("onCompleted")
            }, onDisposed: {
                print("onDisposed")
            })
            .disposed(by: disposeBag)

        viewModel.updateItem()

    }

}
HelloRxViewModel
class HelloRxViewModel {

    var helloWorldObservable: Observable<String> {
        return helloWorldSubject.asObservable()
    }
    private let helloWorldSubject = PublishSubject<String>()

    func updateItem() {
        helloWorldSubject.onNext("Hello World!")
        helloWorldSubject.onCompleted()
    }

}
出力結果
//onNext: HelloWorld!
//onCompleted
//onDisposed

おわりに

RxSwiftまだまだわからないことだらけ、、、
次回