2016-04-11 93 views
3

所以,我希望能夠懶惰地訂閱共享數據,而沒有人在訂閱時不會持續共享數據。然後,如果有人再次訂閱,則會創建一個新的可觀察項。我會使用一個變量,但是如果沒有人訂閱,我不希望它持久化(因爲如果我使用的是數組或者比int更大的東西,我不想將它們保存在內存中)。我目前的實現工作,除了重新訂閱它仍然獲得最後一個值,這意味着該值仍然存在。我正在考慮將觀測值設置爲零,但我不知道該在哪裏做。任何人都可以幫我完成這個嗎?下面的代碼顯示它主要工作,但是看起來數據在沒有人訂閱時仍然存在。RxSwift:如何使用shareReplay來懶洋洋地獲得訂閱

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() 

更新

就我而言,我特別希望得到一個來自磁盤的值(例如Core數據或NSUserDefaults),然後如果有人更新了該值,他們可以發佈到我將通過觀察的通知。因此,爲了讓這個懶加載真正起作用,我還需要一個初始值。因此,在這種情況下使用startWith會很有幫助,其中給startWith的值是磁盤上的當前值。所以代碼將類似於:

Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).startWith(100).shareReplayLatestWhileConnected()