如何使用 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 没有任何关系 - 我只是在为我的动画搜索响应式解决方案时发现它:)