记一次ReactiveObjC的神奇bug
2021-07-15 本文已影响0人
携一两本单色书来
接手的项目线上突然出现了一个bug~

很明显的数组越界,定位到指定控制器。emmm~ 这么多数组,也没法定位到那个数组越界了。
不要急,分析后发现,[0~9]取第59个。这个数组,很分页啊! 十有八九出在这里了~
先看看代码~
controller:
[[RACObserve(self.viewModel, loadState) deliverOn:RACScheduler.mainThreadScheduler]
subscribeNext:^(NSNumber *loadStateNumber) {
...
[self.tableView reloadData];
}];
viewModel:
[request SuccessBlock:^( NSDictionary *data) {
@strongify(self)
self.loadState =Success;
...数据赋值
} failureBlock:^( NSString *errMsg, NSInteger errCode) {
}];
很明显写的有问题,应该是先数据赋值,然后再刷新UI。问题应该就是这里了!
但是,按理说应该是必奔溃的问题,为什么一直没有发现呢?
试验了一下,神奇的事情发生了,这么写居然是没有问题的!
viewModel数据赋值完成后,controller才会刷新。。。奇怪,哪里怪怪的。
去掉控制器的mainThreadScheduler又试了一下,果然,必现。奇怪了,赋值,状态改变,UI刷新都是在main线程的,我以为mainThreadScheduler这句代码没什么用,ReactiveObjC内部不知道干了些什么。。。
记得18年时候试过一次ReactiveObjC,结果通知一直释放不了,之后就一直比较抵触这个东西。后来直接上手了RxSwift,没想到又栽在这里。。