0

私はRxSwiftフレームワークを初めて使用しています。私は実際に学習して基礎を理解しようとしています。パブリッシュサブジェクトを使用して変数の値を観察するにはどうすればよいですか?

private func observeCurrentIndex() -> Observable<Int> { 
    return Observable<Int>.create { (observer) -> Disposable in 
     observer.onNext(self.currentIndex) 
     return Disposables.create() 
    } 
    } 

ここでは、int型のcurrentIndex上にオブザーバブルを作成しました。私がそれを購読すると、currentIndexの最初の値が2になります。それは、currentIndexが変更されたとき(KVOと同じように)私に通知するはずではありませんか?

override func viewDidLoad() { 
    super.viewDidLoad() 
    observeCurrentIndex() 
     .subscribe(onNext: { (valeur) in 
     print("new value \(valeur)") 
     }) 
     .addDisposableTo(disposeBag) 
    } 

currentIndexが値を変更するたびに通知するには、そのためにpublishSubjectを使用する必要があると言われています。

@IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex <= kMaxIndex { 
     currentIndex = currentIndex + 1 
    } 
    } 

誰かがこれを行う方法と方法を教えてください。前もって感謝します。

答えて

2

普通、Subjectは、命令的APIを反応性の世界に橋渡しするために使用されます。件名の使用方法の詳細は、hereを参照してください。

はカップルのソリューションが

class WithIndex: NSObject { 
    dynamic var currentIndex: Int 

    func observeCurrentIndex() -> Observable<Int> { 
    return instance.rx.observe(Int.self, "currentIndex") 
    } 

    @IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex <= kMaxIndex { 
     currentIndex = currentIndex + 1 
    } 
    } 
} 

この解決策の欠点はKVOを利用できるようにするためにWithIndexニーズがNSObjectから継承するということであるKVO 使用RxSwiftのプリミティブ

を使用して変数の進化を観察することがあります。

この1つは、より実用的である可変

class WithIndex { 
    let currentIndex: Variable<Int> 

    func observeCurrentIndex() -> Observable<Int> { 
    return currentIndex.asObservable() 
    } 

    @IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex.value <= kMaxIndex { 
     currentIndex.value = currentIndex.value + 1 
    } 
    } 
} 

を使用します。 currentIndex.value = 12を使用してcurrentIndexの値を設定し、currentIndex.asObservable().subscribe(...)を使用して観察します。

Variableis a simple wrapperBehaviorSubjectとなり、変数の値が変更されるたびに.nextイベントが送信されます。

0

私はRxJSから来ましたが、本当に必要なのはReplaySubjectです。

あなたが提供した最初のコードは、ただ1つの値を返すだけのオブザーバブルを作成しているだけです。 Observable.createのコードは、誰かが毎回.subscribe()を実行するたびに一度実行されます。

パブリッシュは、多くのユーザ間でサブスクリプションを共有することを意味しています...その完璧なケースは、あるサーバから集められた特定の情報をアプリの多くの場所で使用する必要がある場合です...非常に多くのリクエストでサーバーを迷惑メールにしたいので、1つのリクエストを行い、公開するだけで、オブザーバーはその公開されたストリームを購読します。

ReplaySubject(またはBehaviourSubjectが初期化時に初期値を知る必要があります)は、あなたが望む行のほうにあります。ObservableとObserverの両方です。他のオブザーバーが登録できるオブジェクトです.onNext()を呼び出すたびに、すべてのユーザに新しい値が割り当てられます。

Rxは魔法を使うことができません。あなたの変数をいつ編集するのかはわかりません。したがって、オブジェクトに長さ1のReplaySubjectを作成して、それを加入者に返す必要があります。次に、currentIndexが変更されたときにコードを追跡し、そのReplaySubjectのonNextメソッドを呼び出します。