gpt4 book ai didi

ios - 如何使用 ReactiveX 按顺序执行异步

转载 作者:行者123 更新时间:2023-11-28 11:04:36 31 4
gpt4 key购买 nike

我如何利用 ReactiveX按顺序执行异步调用?即,在第一个调用完成后执行第二个调用。

更具体地说,我正在使用 RxSwift在 iOS 中,我想链接在一起的异步是 UIView 动画(而不是在第一个动画的 completion block 中调用第二个动画)。

我知道我还有其他选择,例如 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:链接,是你不必将动画嵌套在完成 block 中。这样,您就可以自行定义它们,然后根据需要组合它们。

作为 RxSwift 的替代品, 查看 PromiseKit . RxSwift 对于你的动画回调需求来说有点矫枉过正。 This blog post特别是相关的。

关于ios - 如何使用 ReactiveX 按顺序执行异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862024/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com