2016-04-11 10 views
3

Yani hiç kimse abone olmadığında daimi olmadan paylaşılan verilere abone olmak istiyorum. Sonra birileri tekrar üye olursa, yeni bir gözlemlenebilir. Bir Değişken kullanabilirdim, ancak hiç kimsenin abone olmaması durumunda ısrar etmesini istemiyorum (çünkü dizilerden daha büyük bir şey kullanıyor olsaydım, bunları bellekte tutmak istemiyorum). Güncel uygulama çalışmalarım, yeniden abone olmanın dışında hala son değeri alır, yani değer hala devam eder. Gözlemlenebilir olanı sıfır olmaya ayarlıyorum ama bunu nerede yapacağımı bilmiyorum. Bunu bana tamamlayan biri var mı? Aşağıdaki kod çoğunlukla çalışmakta olduğunu gösterir, ancak hiç kimse abone olmadığında verilerin gizlenmesini sağlar.RxSwift: Nasıl abonelik olsun tembelleşmek için shareReplay kullanmak

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" 

cevap

0

Sonunda tam olarak ihtiyacım olan şeyi yapan uygun yöntemi buldum. shareReplayLatestWhileConnected() gözlemlenebilir üzerine en son değeri 2., 3., 4. vb. Abonelere tekrar gönderir, ancak herkes abonelikten çıktığı zaman, son değer korunmaz. Bu hat ile ...

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

: Örneğin itibaren

yukarıda bu satırı değiştirin

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

Güncelleme Benim durumumda

, Özellikle bir almak istiyorum diskten değer (örn. Çekirdek veriler veya NSUserDefaults) ve sonra birisi bu değeri güncelleştirirse,ile gözlemleyeceğim bir bildirime gönderilebilir. Bu nedenle, bu tembel yüklemenin gerçekten işe yaraması için, bir başlangıç ​​değeri de istiyorum. Bu nedenle, startWith için verilen değerin diskteki geçerli değer olduğu bu durumda startWith'u kullanmanız yararlı olacaktır. Bu nedenle kod şu şekilde olabilir:

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