2017-07-14 1 views
2

J'ai un Completable renvoyé par une fonction simple. Ce n'est pas un appel asynchrone, donc j'ai juste besoin de retourner une fin succcessful ou erreur en fonction d'un conditionnel (en utilisant Rx ici je peux attacher à d'autres usages Rx):Renvoyer un complétable dans RxSwift sans utiliser un bloc de création

func exampleFunc() -> Completable { 
    if successful { 
     return Completable.just() // What to do here??? 
    } else { 
     return Completable.error(SomeErrorType.someError) 
    } 
} 

Le cas d'erreur fonctionne assez facilement , mais j'ai un bloc sur la façon de simplement retourner un complétant avec succès (sans avoir besoin de .create()).

Je pensais que je juste besoin d'utiliser de .just() ou pouvant être complétée .never(), mais just exige un paramètre, et never ne semble pas déclencher l'événement d'achèvement.

Répondre

3

.empty() est l'opérateur que je recherchais!

Il s'avère que j'avais mélangé les implémentations de .never() et .empty() dans ma tête!

  • .never() émet pas d'articles et ne pas résilier
  • .empty() émet aucun élément mais ne se termine normalement

Ainsi, le code exemple ci-dessus fonctionne comme ceci:

func exampleFunc() -> Completable { 
    if successful { 
     return Completable.empty() 
    } else { 
     return Completable.error(SomeErrorType.someError) 
    } 
} 

Voici le documentation sur vide/jeter/jamais les opérateurs.

0

Je serais plus enclin à faire ce qui suit:

func example() throws { 
    // do something 
    if !successful { 
     throw SomeErrorType.someError 
    } 
} 

Ensuite, pour l'attacher en tout autre code Rx, je voudrais simplement utiliser map comme dans:

myObservable.map { try example() } 

Mais, le mappage sur un Completable ne fonctionne pas car la fermeture de la carte n'est appelée que sur les événements suivants. :-(

Je tends à éviter pour cette pouvant être complétée raison, il ne semble pas jouer avec les autres observables. Je préfère utiliser Observable<Void> et envoyer un événement vide avant le ... terminé

Quelque chose comme ceci:

let chain = Observable<Void>.just() 
let foo = chain.map { try example() } 
foo.subscribe { event in print(event) } 
+0

points positifs que je suis en train d'utiliser de temps en temps des traits si je comprends leurs cas d'utilisation et les limites de meilleures - et remarqués concat fusionner les opérateurs ont été ajoutés à [en V3.5.0 pouvant être complétée] (https:. // github.com/ReactiveX/RxSwift/blob/master/CHANGELOG.md), en espérant qu'ils s'intègrent plus facilement aux autres flux à mesure que d'autres opérateurs sont ajoutés! – Yasir