如何使用 ReactiveX 按顺序执行异步
How to user ReactiveX to execute async's in sequence
如何利用 ReactiveX 按顺序执行异步调用?
即,在第一个调用完成后执行第二个调用。
更具体地说,我正在 iOS 中使用 RxSwift,我想链接在一起的异步是 UIView
动画(而不是在 [= =12=] 第一个块)。
我知道我还有其他选择,例如 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>
,它也会更清晰。
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 is a bit overkill for your animation callback needs. This blog post 特别相关。
对于@Rodrigo Ruiz 来说可能为时已晚,但我相信它可能会帮助其他碰巧遇到此问题的开发人员 post(就像我一样)。
RxAnimated
在 GitHub 免费提供:https://github.com/RxSwiftCommunity/RxAnimated
您可以开始使用这个 blog post
一个小的披露者 - 我与这个项目或 post 没有任何关系 - 我只是在为我的动画搜索响应式解决方案时发现它:)
如何利用 ReactiveX 按顺序执行异步调用? 即,在第一个调用完成后执行第二个调用。
更具体地说,我正在 iOS 中使用 RxSwift,我想链接在一起的异步是 UIView
动画(而不是在 [= =12=] 第一个块)。
我知道我还有其他选择,例如 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>
,它也会更清晰。
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 is a bit overkill for your animation callback needs. This blog post 特别相关。
对于@Rodrigo Ruiz 来说可能为时已晚,但我相信它可能会帮助其他碰巧遇到此问题的开发人员 post(就像我一样)。
RxAnimated
在 GitHub 免费提供:https://github.com/RxSwiftCommunity/RxAnimated
您可以开始使用这个 blog post
一个小的披露者 - 我与这个项目或 post 没有任何关系 - 我只是在为我的动画搜索响应式解决方案时发现它:)