2016-03-09 13 views
12

zu entsorgen Ich habe eine beobachtbare, dass ich nur einmal starten möchte. Die Dokumentation sagt:Richtiger Weg, eine einmalige Observable in RxSwift

Verwenden Sie Entsorgen Taschen oder TakeUntil Operator ist eine robuste Möglichkeit, sicherzustellen, dass Ressourcen gereinigt werden. Wir empfehlen, sie in der Produktion zu verwenden, auch wenn die Sequenzen in endlicher Zeit enden.

Mein beobachtbaren endet nach nur einem Ereignis

let observable = Observable.create() { observer in 
    webservice.makeHTTPRequestWithCompletionBlock { 
    if something { 
     observer.on(.Next(...)) 
     observer.onCompleted() 
    } else { 
     observer.on(.Error(...)) 
    } 
    } 
} 

sagen, dass ich nicht interessiert war Abonnenten diesen beobachtbaren Cancelling, ich will es nur einmal und vollständig ausgeführt werden. Ich möchte, dass der Lebenszyklus dieses Observablen endet, wenn die Arbeit selbst abgeschlossen ist. Das heißt, es gibt keine guten Kandidaten für die Entsorgung. Ich kann das sehen. takeUntil erwartet auch ein 'Ereignis', und es gibt keine guten, die ich sehen kann.

Gerade jetzt löse ich nur die Warnung durch die Einweg-Wegwerfen:

_ = observeable.subscribeNext { ... } 

Gibt es eine Möglichkeit, dies zu tun, oder ein anderes Paradigma, die ich verwenden soll?

Antwort

19

Sowohl DiposeBag und takeUntil werden verwendet, um ein Abonnement vor auf dem Empfang die .Completed/.Error Veranstaltung abzusagen.

Wenn ein Observable abgeschlossen ist, werden alle Ressourcen, die zum Verwalten des Abonnements verwendet werden, automatisch entsorgt.

Ab RxSwift 2.2, Sie können in AnonymousObservable.swift für dieses Verhalten ein Beispiel für die Umsetzung Zeuge

func on(event: Event<E>) { 
    switch event { 
    case .Next: 
     if _isStopped == 1 { 
      return 
     } 
     forwardOn(event) 
    case .Error, .Completed: 
     if AtomicCompareAndSwap(0, 1, &_isStopped) { 
      forwardOn(event) 
      dispose() 
     } 
    } 
} 

Sehen Sie, wie AnonymousObservableSink fordert selbst entsorgen, wenn entweder ein .Error oder ein .Completed Ereignis empfängt, nachdem das Ereignis weiterzuleiten.

Zusammenfassend ist für Ihren Anwendungsfall der Weg zu gehen.

Verwandte Themen