2016-03-09 3 views
12

Mam obserwowalne, że chcę tylko raz się uruchomić. Dokumenty mówią:Właściwy sposób unieszkodliwienia zdarzenia jednorazowego możliwego do zauważenia w RxSwift

Korzystanie z torebek na odpady lub bagażu do momentu, aż operator będzie solidnym sposobem na oczyszczenie zasobów. Zalecamy używanie ich w produkcji, nawet jeśli sekwencje zakończą się w skończonym czasie.

Moi obserwowalne kończy się po jednym razie

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

powiedzieć, że nie był zainteresowany anulowanie abonentom to zaobserwować, po prostu chcę go uruchomić raz i kompletne. Chcę, aby cykl życia tego obserwowalnego zakończył się, gdy sama praca zostanie ukończona. Co oznacza, że ​​nie ma dobrych kandydatów na disposeBag, które widzę. takeUntil również spodziewa się "wydarzenia" i nie ma dobrych, które mogę zobaczyć.

Teraz po prostu rozwiązać ostrzeżenie przez wyrzucać jednorazowy:

_ = observeable.subscribeNext { ... } 

Czy istnieje sposób, aby to zrobić, lub inny paradygmat, że powinienem użyć?

Odpowiedz

19

Zarówno DiposeBag i takeUntil są wykorzystywane, aby anulować subskrypcję przed do odbierania zdarzenia .Completed/.Error.

Po ukończeniu Observable wszystkie zasoby używane do zarządzania subskrypcją są usuwane automatycznie.

Od RxSwift 2.2, można świadczyć przykład wdrożenia takiego zachowania w AnonymousObservable.swift

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

Zobacz jak AnonymousObservableSink rozmowy wyrzucać na sobie po odebraniu OSOBĄ .Error lub zdarzenie .Completed, po przekazaniu zdarzenia.

Podsumowując, w twoim przypadku użycia, _ = jest do zrobienia.