2016-04-11 5 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() 

Update

В моем случае, я специально хочу, чтобы получить значение с диска (например, основные данные или NSUserDefaults), а затем, если кто-то обновит это значение, они могут опубликовать уведомление, которое я буду наблюдать с помощью rx_notification. Поэтому, чтобы эта ленивая загрузка действительно работала, я также хотел бы получить начальное значение. Поэтому было бы полезно использовать startWith в этом случае, где значение, заданное startWith, является текущим значением на диске. Таким образом, код будет аналогичен:

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