如何利用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/

10-12 13:47