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
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
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
@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. –