用RXSwift观察contentSize时检测到再入异常



对于带有RXSwift的表格视图,我有以下设置:

override func viewDidLoad() {
super.viewDidLoad()
// Constraints setup etc

items
.subscribeOn(MainScheduler.instance)
.bind(to: tableView.rx.items(cellType: SomeCell.self)) { [weak self] row, item, cell in
// Code
}
.disposed(by: bag)
// Observe the contentSize of tableView to update PanModal's height.
tableView.rx.observe(CGRect.self, "contentSize")
.subscribeOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] _ in
// Code
})
.disposed(by: bag)
}

似乎是因为我订阅了contentSizeRXSwift,所以我现在得到了以下错误:

⚠️检测到再入异常。调试:要调试此问题,您可以在/Users/kekearif/Documents/Snapask/ios-app/Pods/RxSwift/RxSwift/Rx.swift:96中设置断点,并观察调用堆栈。问题:此行为破坏了可观察序列语法。next (error | completed)?这种行为破坏了语法,因为序列事件之间存在重叠。可观察序列正在尝试在前一个事件的发送完成之前发送一个事件。解释:这可能意味着你的代码中存在某种意想不到的循环依赖,或者系统没有以预期的方式运行。补救措施:如果这是预期行为,则可以通过添加.observeOn(MainScheduler.asyncInstance)来抑制此消息或者通过以某种其他方式对序列事件进行排队。

以前有人见过这个吗?你知道是什么导致了这个错误吗?我试着按照建议添加.observeOn(MainScheduler.asyncInstance),当我展示视图控制器时,UI就会锁定。

任何关于如何解决此问题的建议都将不胜感激!

这不是因为您订阅了contentSize,请注意,您发布的代码不会导致异常;正是由于您在订阅(或绑定(中所做的操作,才导致了问题的出现。

正如您收到的警告中所解释的;可观察序列正在尝试在前一个事件的发送完成之前发送一个事件"这通常是由程序员在绑定到主题的订阅内发送主题的onNext事件引起的。在这种情况下,您可能正在从订阅中更改表视图的contentSize。解决办法是不要那样做。

多解释一下你为什么认为你需要这样做,也许我可以向你展示一个更好的方法。

最新更新