Wie man ReactiveX benutzt, um Async in der Reihenfolge auszuführen - ios, swift, asynchron, rx-swift, reactivex

Wie nutze ich? ReaktivX asynchrone Aufrufe in Folge ausführen? Das heißt, führe einen zweiten Anruf aus, nachdem der erste beendet ist.

Genauer gesagt, ich arbeite mit RxSwift in iOS, und die asyncs möchte ich zusammen ketten UIView Animationen (anstatt die zweite Animation innerhalb der completion Block des ersten).

Ich weiß, ich habe andere Möglichkeiten wie Einfache Animation, aber ich würde gerne Rx nutzen, da ich es bereits für Streams verwende.

Auch eine Lösung wäre (für 3 verkettete Animationen):

_ = UIView.animate(duration: 0.2, animations: {
sender.transform = CGAffineTransformMakeScale(1.8, 1.8)
})
.flatMap({ _ in
return UIView.animate(duration: 0.2, animations: {
sender.transform = CGAffineTransformMakeScale(0.8, 0.8)
})
})
.flatMap({ _ in
return UIView.animate(duration: 0.2, animations: {
sender.transform = CGAffineTransformIdentity
})
})
.subscribeNext({ _ in })

Aber ich suche nach etwas eleganterem, dem richtigen Weg, es mit Rx zu machen.

Antworten:

2 für die Antwort № 1

Ich denke nicht mit Rx macht es viel sauberer, aber hier ist, wie Sie es tun könnten:

let animation1 = Observable<Void>.create { observer in
UIView.animateWithDuration(0.2,
animations: {
// do your animations
}, completion: { _ in
observer.onCompleted()
})
return NopDisposable.instance
}

let animation2 = Observable<Void>.create { observer in
UIView.animateWithDuration(0.2,
animations: {
// do your animations
}, completion: { _ in
observer.onCompleted()
})
return NopDisposable.instance
}

Observable.of(animation1, animation2)
.concat()
.subscribe()
.addDisposableTo(disposeBag)

Es wäre auch sauberer, wenn Sie eine Funktion zum Konstruieren des Observable<Void>s für dich.

func animation(duration: NSTimeInterval, animations: () -> Void) -> Observable<Void> {
return Observable<Void>.create { observer in
UIView.animateWithDuration(duration,
animations: animations,
completion: { _ in
observer.onCompleted()
})
return NopDisposable.instance
}

Ich denke, eine Plus-Seite zu verwenden Rx statt nur animateWithDuration:animations: Angekettet ist, dass Sie die Animationen nicht in Completion-Blöcke verschachteln müssen. So können Sie sie einfach selbst definieren und nach Belieben komponieren.

Als Alternative zu RxSwift, Auschecken PromiseKit. RxSwift ist ein bisschen übertrieben für Ihre Animation Callback Bedürfnisse. Dieser Blogbeitrag insbesondere ist relevant.


1 für die Antwort № 2

Vielleicht ist es zu spät für @Rodrigo Ruiz, aber ich bin sicher, dass es anderen Entwicklern helfen könnte, die zufällig auf diesen Beitrag stoßen (wie ich).

RxAnimated ist kostenlos auf GitHub verfügbar: https://github.com/RxSwiftCommunity/RxAnimated

Sie können damit beginnen Blogeintrag

Ein kleiner Entdecker - ich bin auf keinen Fall mit diesem Projekt oder Post verbunden - ich habe es gerade gefunden, als ich nach einer reaktiven Lösung für meine Animationen suchte :)


Speisekarte