LoginSignup
0
1

More than 3 years have passed since last update.

【Swift】RxSwift勉強してみたPart3

Last updated at Posted at 2021-04-03

はじめに

前回に引き続き、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まだまだわからないことだらけ、、、
次回

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1