代码之家  ›  专栏  ›  技术社区  ›  cleg

为UIPageViewController进行RxCocoa绑定。setViewControllers(如何同步Observable)

  •  2
  • cleg  · 技术社区  · 7 年前

    当前,我想绑定 Observable<UIViewController> 给我的 UIPageViewController .最初的想法简单明了:

    viewControllerObservable
        .subscribe(onNext: { [weak self] viewController in
    
            self?.pageVC.setViewControllers([viewController], 
                                            direction: .forward, 
                                            animated: false, 
                                            completion: nil)
         })
        .disposed(by: disposeBag)
    

    但如果viewControllerObservable中的值更改过快,则page view controller会在添加以前的视图控制器之前收到新的set命令 NSInternalInconsistencyException

    我可以使用 Binder ,但我仍然会面临同样的问题。

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

    理想情况下,我需要某种方法来保持进一步的值处理,直到 completion 已调用 setViewControllers

    我如何才能做到这一点?

    1 回复  |  直到 7 年前
        1
  •  1
  •   cleg    7 年前

    所以,到目前为止,我找到的最好的解决方案是使用第二个可观测值进行同步。

    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 等待两个可观察对象发出值,它将被“锁定”,直到 sync 将接收下一个值。