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

时间:2016-08-09 23:31:33

标签: ios swift asynchronous rx-swift reactivex

如何利用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做正确的方法。

2 个答案:

答案 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

一个小的披露者 - 我没有以任何方式连接到这个项目或帖子 - 我只是在为我的动画搜索反应性解决方案时找到它:)