2016-08-09 6 views
0

Как использовать ReactiveX для выполнения асинхронных вызовов в последовательности? I.e., выполнить второй вызов после завершения первого.Как пользователь ReactiveX для выполнения async в последовательности

Более конкретно, я работаю с 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.

+0

Что случилось с вашим примером кода? Вы имели в виду, что это псевдо-код? Вы вызываете 'flatMap' на' Void', а не 'SequenceType' или' Observable'. Кроме того, это 'animateWithDuration: анимации:', а не 'animate: animations:'. Я не уверен, что вы намеревались включить этот код. – solidcell

+0

Я создал метод 'animate: ...' для возврата наблюдаемого, поэтому no, а не псевдокод –

ответ

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' doe this? И это точно моя проблема, я не хочу иметь вложенные обратные вызовы. –

+0

Кроме того, для чего мне нужен '.addDisposableTo (disposeBag)'? не должен ли наблюдатель уйти сам по себе после завершения? –

1

Возможно, слишком поздно для @Rodrigo Ruiz, но я уверен, что это может помочь другим разработчикам, которые попадают на этот пост (как и я).

RxAnimated доступен бесплатно на GitHub: https://github.com/RxSwiftCommunity/RxAnimated

Вы можете начать использовать этот blog post

Небольшой РАЗГЛАШАЮЩЕЙ - Я не подключен к данному проекту или по почте любым способом - я только что нашел его при поиске реактивного решения для моей анимации :)

 Смежные вопросы

  • Нет связанных вопросов^_^