簡體   English   中英

RxSwift:如何使用shareReplay懶惰地獲得訂閱

[英]RxSwift: How to use shareReplay to lazily get subscription

因此,我希望能夠懶惰地訂閱共享數據,而不會在沒有人訂閱時保持共享數據。 然后,如果有人再次訂閱,將創建一個新的observable。 我會使用一個變量,但如果沒有人訂閱我不希望它持續存在(因為如果我使用數組或大於int的東西我不想將它們保留在內存中)。 我當前的實現工作,除了重新訂閱它仍然獲得最后一個值,這意味着該值仍然是持久的。 我正在考慮將observable設置為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"

我終於找到了方便的方法,完全符合我的需要。 shareReplayLatestWhileConnected()上的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),然后如果有人更新了該值,他們可以發布我將用rx_notification觀察到的通知。 因此,為了使這個延遲加載真正起作用,我還想要一個初始值。 因此,在這種情況下使用startWith會很有幫助,其中給startWith的值是磁盤上的當前值。 所以代碼類似於:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM