问题场景
当数据刚好占满一屏幕,数据源减少,下拉刷新,会产生崩溃。
bug代码
[tableView.mj_footer endRefreshing];
[tableView.mj_header endRefreshing];
NSArray * array = responseObject[@"data"][@"couponMembers"];
if (array.count == 0) {
[tableView.mj_footer endRefreshingWithNoMoreData];
}
[tableView reloadData];
问题解析
在调用endRefreshing
时,刷新头首期,tableView也会跟着向上滚动,下拉滚动到屏幕外的cell会重新回到屏幕里,此时就会调用cell复用的方法,因为在调用endRefreshing
之前数据源已经发生变化,这时再取数据就会数组越界而崩溃。
解决方法
处理起来很简单,只要优先执行[tableView reloadData]
。
但这样也会造成其他问题,刷新数据不够一屏幕,下拉刷新后mj_footer
会以待加载的状态出现,此处为了处理方便,在数据不足时我是在numberOfRowsInSection:
方法中判断执行[tableView.mj_footer endRefreshingWithNoMoreData];
。
所以我这里的处理方式为:
[tableView.mj_footer endRefreshing];
[tableView reloadData];
[tableView.mj_header endRefreshing];
NSArray * array = responseObject[@"data"][@"couponMembers"];
if (array.count == 0) {
[tableView.mj_footer endRefreshingWithNoMoreData];
}
提醒
问题不难,主要需要合理调用顺序