2016-04-11 8 views
3

誰も購読していないときに永続することなく、共有データを遅れて購読することができるようにしたい。その後、誰かが再び購読すると、新しい観測値が作成されます。変数を使用しますが、誰も購読していなければ永続化したくありません(なぜなら、配列を使用していたり​​、intよりも大きいものをメモリに保持したくないからです)。私の現在の実装は機能しますが、それでもまだサブスクライブしても最後の値が得られます。つまり、値はまだ保持されています。私はobservableを無限に設定しようと考えていますが、どこでそれを行うべきかわかりません。誰も私がこれを完了するのを助けることができる?下のコードはほとんどの場合動作していますが、誰も購読していないときにデータが固執しているようです。RxSwift:shareReplayを使ってlazily get subscriptionを利用する方法

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" 

答えて

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)を読み込み、誰かがその値を更新すると、私はで告知する通知に投稿することができます。したがって、この遅延読み込みが本当に機能するためには、初期値が必要です。したがって、この場合はstartWithを使用すると便利です。ここでは、startWithに与えられた値がディスク上の現在の値です。したがって、コードは次のようになります。

Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).startWith(100).shareReplayLatestWhileConnected() 
関連する問題