2016-03-16 17 views
8

Jestem nowicjuszem w RxSwift i potrzebuję bardzo podstawowej pomocy.
Załóżmy, że mam Obserwowalne i subskrybuję to w ten sposób.Emituj zdarzenie ręcznie w 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 { 

     } 
    } 

I subskrybować tak:

source.subscribeNext {() -> Void in 

    } 

Pytanie brzmi: w jaki sposób można emitować zdarzenia do subscribeNext ręcznie za każdym razem muszę. Jest to podobne do zachowania rx_tap na UIButton.
Widzę w przykładowym kodzie coś takiego: source = button.rx_tap.asObservale(). Następnie, za każdym razem, gdy użytkownik kliknie przycisk, emituje zdarzenie i wywołuje funkcję subscribeNext(). Też chcę mieć to zachowanie, ale programowo, nie ze zdarzenia UI.

Odpowiedz

11

W większości przypadków można skomponować obserwowalne i rozwiązanie, które mam zamiar podać, nie jest zalecanym sposobem wykonywania kodu Rx.

Możesz obejrzeć Subject, aby zaimplementować żądane zachowanie. Istnieje wiele wariacji na temat, które dokumentacja dobrze wyjaśnia.

Przykładem użycia, inspirowany z RxSwift na playground:

let subject = PublishSubject<String>() 

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

To będzie drukować "a" następnie "b".

Aby uzyskać więcej szczegółowych informacji na temat tego, kiedy należy użyć tematu lub nie, polecam lekturę this article.

+0

Hi @tomahh, Twoje rozwiązanie działa. Jaka jest jednak przyczyna, dla której wspomniałeś o tym, że nie jest to zalecany sposób? A co powiesz na temat porównania z '' 'AnyObserver ' ''.
Z '' 'AnyObserver <>' '', możemy użyć go lubię:
'var beginLoad: AnyObserver ' 'beginLoad = AnyObserver (Podprogram: {(event) -> Pustki w print (” 1234543 ") })' 'beginLoad.on (.Next())' – user1066518

+0

Także '' PublishSubject () '' 'nie jest' '' Observable''', więc nie możemy używać operatorów na nim (spłaszcz, konkat ....). – user1066518

+1

Możesz wywołać 'asObservable()' na obiekcie, aby uzyskać go jako 'Observable'. – tomahh

0

dla kierowcy, można zrobić

var isSearching: Driver<Bool> 

isSearching = Driver.just(true)