为 UIPageViewController.setViewControllers 绑定 RxCocoa(如何同步 Observable)
Make RxCocoa binding for UIPageViewController.setViewControllers (how to synchronize Observable)
目前,我想将 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
.
我可以使用 Binder
使该代码更多 "reactive",但我仍然会遇到同样的问题。
这里很明显的方法是使用油门,但它似乎是很脏的修复,屏蔽问题,而不是修复它。
理想情况下,我需要一些方法来保存进一步的值处理,直到在 setViewControllers
中调用 completion
。
我怎样才能做到这一点?
所以,到目前为止,我遇到的最佳解决方案是使用第二个可观察对象来实现同步。
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 发出值,它将是 "locked" 直到 sync
收到下一个值。
目前,我想将 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
.
我可以使用 Binder
使该代码更多 "reactive",但我仍然会遇到同样的问题。
这里很明显的方法是使用油门,但它似乎是很脏的修复,屏蔽问题,而不是修复它。
理想情况下,我需要一些方法来保存进一步的值处理,直到在 setViewControllers
中调用 completion
。
我怎样才能做到这一点?
所以,到目前为止,我遇到的最佳解决方案是使用第二个可观察对象来实现同步。
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 发出值,它将是 "locked" 直到 sync
收到下一个值。