2016-08-09 73 views
0

如何使用ReactiveX按順序執行異步調用? 即,在第一個完成後執行第二個呼叫。如何使用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這樣做的正確方法。

+0

怎麼了你的代碼示例?你的意思是它是僞代碼嗎?你在'Void'上調用'flatMap',而不是'SequenceType'或'Observable'。另外,animateWithDuration:動畫:',而不是'animate:動畫:'。我不確定你打算加入該代碼的意圖。 – solidcell

+0

我創建了'animate:...'方法來返回一個observable,所以不,不是僞代碼 –

回答

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尤其是相關的。

+0

不會'Observable.of(animation1,animation2).concat()'並行運行它們? –

+0

,你會使用除'Rx'之外的其他東西嗎?這正是我的問題,我不想嵌套回調。 –

+0

另外,爲什麼我需要'.addDisposableTo(disposeBag)'?觀察員完成後不應該自行離開? –

1

或許對於@Rodrigo Ruiz來說太遲了,但我相信這可能會幫助碰巧遇到這篇文章的其他開發者(就像我一樣)。

RxAnimated是免費的在GitHub上:https://github.com/RxSwiftCommunity/RxAnimated

您可以使用此blog post

一個小的披露開始 - 我沒有連接到該項目或交以任何方式 - 我只是發現它同時爲我的動畫尋找反應性解決方案:)