为UIPageViewController.setViewControllers创建RxCocoa绑定(如何同步Observable)

时间:2018-04-10 14:39:56

标签: swift rx-swift rx-cocoa

目前,我想将Observable<UIViewController>的值绑定到我的UIPageViewController。最初的想法很简单明了:

viewControllerObservable
    .subscribe(onNext: { [weak self] viewController in

        self?.pageVC.setViewControllers([viewController], 
                                        direction: .forward, 
                                        animated: false, 
                                        completion: nil)
     })
    .disposed(by: disposeBag)

但是如果viewControllerObservable中的值变化太快,页面视图控制器会在添加以前的视图控制器并且我获得NSInternalInconsistencyException之前接收到新的set命令。

我可以使用Binder使代码更多&#34;反应&#34;但我仍然会面临同样的问题。

这里非常明显的方法是使用油门,但它似乎是非常脏的修复,掩盖问题,而不是修复它。

理想情况下,在completion调用setViewControllers之前,我需要一些方法来进行进一步的值处理。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

所以,到目前为止,最好的解决方案是使用第二个observable进行同步。

let sync = BehaviorSubject<Void>(value: ())

Observable.zip(pageProvider.selectedViewControllerObservable, sync)
    .subscribe(onNext: { [weak self] viewController, _ in
        self?.pageVC.setViewControllers([viewController],
                                        direction: .forward,
                                        animated: false,
                                        completion: {sync.onNext()})
    })
    .disposed(by: disposeBag)

Observable.zip等待两个observable都发出值时,它将被“锁定”,直到sync将接收下一个值。