6

私は Rx を調査していて、この要素のコンポーネントが初期化される前に、UI 要素の入力出力を相互に宣言的に定義できるかどうかを確認したかったのです。

これは次のようになります。

class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!

    var child: ButtonComponent!

    override func viewDidLoad() {
        super.viewDidLoad()

        let buttonInput = PublishSubject<()>()
        let buttonOutput = buttonInput
            .scan(0) { count, _ in
                count + 1
            }
            .map { $0.description }

        self.child = ButtonComponent(
            button: self.button,
            input: buttonInput,
            output: buttonOutput
        )
    }
}

class ButtonComponent {
    weak var button: UIButton!
    let disposeBag = DisposeBag()

    init(button: UIButton, input: PublishSubject<()>, output: Observable<String>) {
        self.button = button

        output
            .subscribeNext { string in
                button.setTitle(string, forState: .Normal)
            }
            .addDisposableTo(disposeBag)

        button.rx_tap
            .subscribeNext {
                input.onNext($0)
            }
            .addDisposableTo(disposeBag)
    }
}

ここでの問題は、PublishSubject を使用して更新を入力ストリームにプッシュしていることです。これは必須であり、推奨されていません。Rx は、すでに実行中のオブザーバブルに何らかの方法でシーケンスを追加する方法を提供しますか?

4

1 に答える 1