2016-03-16 16 views
8

Sono un principiante in RxSwift e ho bisogno di un aiuto di base.
Suppongo di avere un osservabile e di iscriverlo in questo modo.Emettere un evento manualmente in RxSwift

let source: Observable<Void> = Observable.create { [weak self] observer in 

     guard let _ = self else { 
      observer.on(.Completed) 
      return NopDisposable.instance 
     } 

     observer.on(.Next()) 

     return AnonymousDisposable { 

     } 
    } 

E la sottoscrizione in questo modo:

source.subscribeNext {() -> Void in 

    } 

la domanda è: come posso emettere l'evento per subscribeNext manualmente ogni volta che ho bisogno. Questo è come il comportamento rx_tap su UIButton.
Vedo nell'esempio codice ha qualcosa di simile a questo source = button.rx_tap.asObservale(). Successivamente, ogni volta che l'utente tocca il pulsante, verrà emesso un evento e attivato su subscribeNext(). Voglio anche avere quel comportamento, ma in modo programmatico, non dall'evento UI.

risposta

11

La maggior parte delle volte è possibile comporre l'osservabile e la soluzione che sto per fornire non è il metodo consigliato per eseguire il codice Rx.

È possibile esaminare Subject per implementare il comportamento richiesto. Ci sono più varianti sull'argomento, che la documentazione spiega bene.

Un esempio di utilizzo, ispirato RxSwift di playground:

let subject = PublishSubject<String>() 

_ = subject.subscribeNext { content in 
    print(content) 
} 
subject.on(.Next("a")) 
subject.on(.Next("b")) 

Questo stamperà "a" poi "b".

Per ulteriori dettagli su quando utilizzare oggetto o meno, mi consiglia di leggere this article.

+0

Hi @tomahh, La soluzione funziona. Tuttavia, qual è la ragione per cui l'hai menzionata come "non consigliata"? E che ne dici di quando confrontarlo con '' 'AnyObserver ' ''.
Con '' 'AnyObserver <>' '', possiamo usarlo come:
'var beginLoad: AnyObserver ' 'beginLoad = AnyObserver (EventHandler:? {(Evento) -> Void in di stampa (" 1234543 ") ' beginLoad.on (.Next()) ' – user1066518

+0

Anche questo' '' PublishSubject () '' 'non è un' '' Osservabile''', quindi non possiamo usare gli operatori su di esso (appiattito, concat ....). – user1066518

+1

Puoi chiamare 'asObservable()' sul soggetto per ottenerlo come 'Osservabile'. – tomahh

0

per un pilota, si può fare

var isSearching: Driver<Bool> 

isSearching = Driver.just(true) 
Problemi correlati