如何利用ReactiveX按顺序执行异步调用?
即,在第一个呼叫完成后执行第二个呼叫。
更具体地说,我在iOS中使用的是RxSwift,我希望将异步链接在一起的是UIView
动画(而不是在第一个completion
块中调用第二个动画)。
我知道我还有其他选择,比如Easy Animation,但我想利用Rx,因为我已经在使用它进行流。
另外,一个解决方案是(对于3个链接动画):
_ = 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 })
但我正在寻找更优雅的东西,正确的方式做它与Rx。
最佳答案
我不认为使用Rx
会让它变得更干净,但下面是您如何做到的:
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)
如果您创建一个函数来为您构造
Observable<Void>
s,那么它也会更干净。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
}
我想使用
Rx
而不仅仅是animateWithDuration:animations:
链接的一个好处是,您不必在完成块中嵌套动画。这样,你就可以自己定义它们,然后根据你的需要组合它们。作为
RxSwift
的替代方案,请查看PromiseKit
。RxSwift对于你的动画回调需求来说有点过头了。This blog post尤其重要。关于ios - 如何使用ReactiveX按顺序执行异步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38862024/