【问题标题】:Make RxCocoa binding for UIPageViewController.setViewControllers (how to synchronize Observable)为 UIPageViewController.setViewControllers 做 RxCocoa 绑定(如何同步 Observable)
【发布时间】:2018-04-10 14:39:56
【问题描述】:

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

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

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

但如果 viewControllerObservable 中的值变化太快,页面视图控制器会在添加前一个视图控制器之前接收新的 set 命令,我会收到 NSInternalInconsistencyException

我可以使用Binder 使该代码更具“反应性”,但我仍然会面临同样的问题。

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

理想情况下,我需要一些方法来处理进一步的值,直到在 setViewControllers 中调用 completion

我怎样才能做到这一点?

【问题讨论】:

    标签: swift rx-swift rx-cocoa


    【解决方案1】:

    所以,到目前为止,我最好的解决方案是使用第二个 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 等待两个可观察对象发出值时,它将被“锁定”,直到sync 接收到下一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多