4

FRP の理解をReactiveCocoa 2.5からRxSwiftに移行しようとしていますが、誤解が 1 つあります。ReactiveCocoaではrac_signalForSelector、メソッドの呼び出しを監視したいときに使用しました。RxSwift を使用してこのロジックを実装する方法はありますか?

testメソッドが呼び出されたときにサブスクリプションを破棄する小さな例を書きました。しかし、購読ブロックではまだnext(6)イベントを見ることができます。私は何を間違っていますか?

let subject = PublishSubject<Int>()
subject.takeUntil(self.rx.sentMessage(#selector(test))).subscribe { event in
    print(event)
}

subject.onNext(3)
test()
subject.onNext(6)

//////////////////

func test() {

}
4

5 に答える 5

2

同じ問題が発生した後にこのコメントを追加していますが、解決しました。

私にとっての解決策は、-これがあなたが探しているものではない場合は申し訳ありませんが、同じ問題を抱えている他の人を助けることを願っています-、dynamic観察された関数の修飾子を追加するだけでした。

これがコードです

func viewDidLoad() {
    rx.sentMessage(#selector(ViewController.test))
        .debug("Test", trimOutput: true)
        .subcribe()
        .disposed(by: bag)
}

@objc dynamic test() {}

修飾子がないdynamicと、デバッグは何も出力しないため、test の呼び出しは観察されません。

私はRxSwiftを初めて使用します。

上記の@zhongwuzwに感謝します。彼のコメントを読んだ後にアイデアを得ました。

于 2018-02-23T06:57:10.963 に答える
0

sentMessage の使用を回避する別の解決策は、testSubject を定義し、テスト関数で次のイベントをトリガーすることです。

let subject = PublishSubject<Int>()
let testSubject = PublishSubject<Void>()

subject.takeUntil(testSubject).subscribe { event in
    print(event)
}

subject.onNext(3)
test()
subject.onNext(6)

//////////////////

func test() {
    testSubject.onNext(())
}

これは、test() が呼び出されるまでのみ出力されます。

于 2019-04-10T14:22:28.723 に答える