web-dev-qa-db-fra.com

Émettre un événement manuellement dans RxSwift

Je suis un débutant dans RxSwift et j'ai besoin d'une aide très basique.
Supposez que j'ai un observable et abonnez-le comme ceci.

 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 {

        }
    }

Et les abonnés comme ceci:

 source.subscribeNext { () -> Void in

    }

La question est: comment puis-je émettre l'événement à subscribeNext manuellement chaque fois que j'en ai besoin? C'est comme comportement rx_tap sur UIButton.
Je vois dans l'exemple que le code a quelque chose comme ceci: source = button.rx_tap.asObservale(). Après cela, chaque fois que l'utilisateur appuie sur le bouton, un événement et un déclencheur sont déclenchés sur subscribeNext (). Je veux aussi avoir ce comportement mais par programme, pas d'événement d'interface utilisateur.

12
dummy307

La plupart du temps, vous pouvez composer votre observable et la solution que je vais vous donner n'est pas la méthode recommandée pour créer du code Rx.

Vous pouvez consulter Subject pour implémenter le comportement que vous demandez. Il existe de nombreuses variantes sur le sujet, que la documentation explique bien.

Un exemple d'utilisation inspiré de playground : de RxSwift

let subject = PublishSubject<String>()

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

Ceci imprimera "a" puis "b".

Pour plus de détails sur le moment d'utiliser ou non le sujet, je vous recommande de lire cet article .

15
tomahh

Pour un pilote, vous pouvez faire

var isSearching: Driver<Bool>

isSearching = Driver.just(true)
0
Maria