3

そのため、誰もサブスクライブしていない場合でも共有データを永続化せずに、遅延サブスクライブできるようにしたいと考えています。その後、誰かが再びサブスクライブすると、新しいオブザーバブルが作成されます。私は変数を使用しますが、誰もサブスクライブしていない場合は永続化したくありません (配列または int より大きいものを使用している場合、それらをメモリに保持したくないため)。私の現在の実装は機能しますが、再サブスクライブする場合を除き、最後の値を取得します。つまり、値は引き続き保持されます。オブザーバブルをnilに設定することを考えていますが、どこでそれを行うべきかわかりません。誰でもこれを完了するのを手伝ってもらえますか? 以下のコードは、ほとんどが機能していることを示していますが、誰も購読していないときにデータが残っているようです.

    var switchTwoDisposable: Disposable? = nil
​    
    @IBAction func switchOneChanged(sender: UISwitch) {
        if sender.on {
            self.switchOneDisposable = currentNumber().subscribeNext { (value) in
            log.debug("Switch 1: \(value)")
        }
      } else {
        switchOneDisposable?.dispose()
      }
    }
    ​
    @IBAction func switchTwoChanged(sender: UISwitch) {
      if sender.on {
        self.switchTwoDisposable = currentNumber().subscribeNext { (value) in
          log.debug("Switch 2: \(value)")
        }
      } else {
        switchTwoDisposable?.dispose()
      }
    }
    ​
    var numberObservable: Observable<Int>? = nil
    ​
    func currentNumber() -> Observable<Int> {
      if let number = numberObservable {
        return number
      }
      self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplay(1)
      return self.numberObservable!
    }
    ​
    ​
    // Switch 1 turned on
    // logs "Switch 1: 0"
    // logs "Switch 1: 1"
    // Switch 2 turned on
    // immediately logs "Switch 2: 1"
    // logs "Switch 1: 2"
    // logs "Switch 2: 2"
    // Switch 1 turned off
    // logs "Switch 2: 3"
    // Switch 2 turned off
    // nothing happens here until we take action again
    // Switch 1 turned on
    // logs "Switch 1: 3"
    // logs "Switch 1: 0"
4

1 に答える 1

0

私はついに、まさに必要なことを行う便利な方法を見つけました。 shareReplayLatestWhileConnected()オブザーバブルでは、2 番目、3 番目、4 番目などのサブスクライバーに最新の値をリプレイしますが、全員がサブスクライブを解除すると、最後の値は保持されません。

上記の例から、次の行を置き換えます。

self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplay(1)

...次の行で:

self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplayLatestWhileConnected()

アップデート

私の場合、具体的にはディスクから値を取得したいと考えています (コア データや NSUserDefaults など) rx_notification。したがって、この遅延読み込みが真に機能するためには、初期値も必要です。したがってstartWith、startWith に指定された値がディスク上の現在の値である場合に使用すると便利です。したがって、コードは次のようになります。

Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).startWith(100).shareReplayLatestWhileConnected()
于 2016-04-11T04:16:15.267 に答える