2017-08-25 7 views
2

Je remplace actuellement PromiseKit avec RxSwift, et j'ai besoin de convertir ma promesse différée en RxSwift.Swift 3: Convertir PromiseKit différé en RxSwift

exemple de mise en œuvre actuelle PromiseKit:

private var deferredDidLayout = Promise<()>.pending() 

override func layoutSubviews() { 
    super.layoutSubviews() 

    self.deferredDidLayout.fulfill() 
} 

func setup() { 
    _ = self.didLayout().then {_ -> Void in 
     // Do my stuff only one time! 
    } 
} 

private func didLayout() -> Promise<()> { 
    return self.deferredDidLayout.promise 
} 

hack mise en œuvre actuelle RxSwift:

private let observableDidLayout = PublishSubject<Void>() 

override func layoutSubviews() { 
    super.layoutSubviews() 

    self.observableDidLayout.onCompleted() 
} 

func setup() { 
    _ = self.observableDidLayout 
     .subscribe(onCompleted: { _ in 
      // Do my stuff only one time! 
      // Issue: Will be executed on every onCompleted() call 
    }) 
} 

Merci en ce qui concerne!

PromiseKit: https://github.com/mxcl/PromiseKit RxSwift: https://github.com/ReactiveX/RxSwift

Répondre

2

Je crois que 'pouvant être complétée' est ce que vous cherchez - https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Traits.md#creating-a-completable

+0

Merci pour votre réponse! 'Completable' pourrait faire partie de la solution. Mais cela ne satisfait pas tout mon problème: - Lorsque le premier abonné s'abonne à 'cacheLocally()' de votre lien, le 'Completable' émet une erreur ou un état terminé. - Lorsque le second abonné s'abonne à 'cacheLocally()' l'état ci-dessus (erreur ou terminé) doit être sauvegardé, signifiant 'cacheLocally()' ne doit être exécuté qu'une seule fois et ensuite exécuter directement les deuxièmes méthodes onCompleted/onError ? De cette façon, 'cacheLocally()' ne devrait pas créer un nouveau 'Completable', mais réutiliser le même. – PAK

+0

Dans ma question initiale, l'implémentation dans PromiseKit remplit une fois ma promesseDidLayout différée. Et si une deuxième fonction utilisée (_ = self.didLayout(). Then {}) après que la promesseDiffLayout différée ait été satisfaite, le code à l'intérieur de {} dans la deuxième fonction serait exécuté directement. – PAK

+1

@PAK il y a beaucoup de possibilités pour mettre en tampon/rejouer le dernier état dans Rx. Eventuellement, quelque chose comme '.asObservable(). Materialize(). ShareReplay (1)' fera, ou d'autres '.share() /. Replay()' opérateurs. Ou peut-être que 'ReplaySubject' conviendra mieux. Ou 'BehaviorSubject'. Il y a vraiment beaucoup de façons de le faire, cela dépend de votre cas particulier. –