如何利用ReactiveX按顺序执行异步调用? 即,在第一个完成后执行第二个调用。
更具体地说,我在iOS中使用RxSwift,我想要链接在一起的asyncs是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做正确的方法。
答案 0 :(得分:2)
我不认为使用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>
,那么它也会更清晰。
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特别相关。
答案 1 :(得分:1)
对于@Rodrigo Ruiz来说可能为时已晚,但我相信它可能会帮助碰巧碰到这篇文章的其他开发人员(就像我一样)。
RxAnimated
可在GitHub上免费获取:https://github.com/RxSwiftCommunity/RxAnimated
您可以开始使用此blog post
一个小的披露者 - 我没有以任何方式连接到这个项目或帖子 - 我只是在为我的动画搜索反应性解决方案时找到它:)