2016-03-09 3 views
12

Ho notato che voglio solo dare il via una volta. I documenti dicono:Modo corretto per smaltire un osservabile una tantum in RxSwift

Utilizzo di sacchetti di raccolta o presa L'operatore di operatore è un modo efficace per assicurarsi che le risorse vengano pulite. Si consiglia di utilizzarli in produzione anche se le sequenze terminano in un tempo limitato.

miei termina osservabili dopo un solo evento

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

dire che non ero interessato a cancellazione di abbonati a questo osservabile, voglio solo correre una volta e completa. Voglio che il ciclo di vita di questo osservabile finisca quando il lavoro stesso è completato. Significa che non ci sono buoni candidati per disposeBag che posso vedere. takeUntil si aspetta anche un 'evento', e non ce ne sono di validi che io possa vedere.

In questo momento ho solo risolvere l'avvertimento buttando via l'usa e getta:

_ = observeable.subscribeNext { ... } 

C'è un modo per fare questo, o un diverso paradigma che devo usare?

risposta

19

Sia DiposeBag e takeUntil sono utilizzati per annullare una sottoscrizione prima di ricevere l'evento .Completed/.Error.

Quando un Observable viene completato, tutte le risorse utilizzate per gestire l'abbonamento vengono eliminate automaticamente.

A partire dal RxSwift 2.2, è possibile assistere ad un esempio di implementazione per questo comportamento in 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() 
     } 
    } 
} 

Vedere come AnonymousObservableSink chiamate smaltire su se stesso quando si riceve sia un .Error o di un evento .Completed, dopo l'inoltro della manifestazione.

In conclusione, per il vostro caso d'uso, _ = è la strada da percorrere.