前提:(UITableView和UICollectionView等列表控制器刷新),使用MJRefresh第三方框架
A.首先,我們來(lái)先理清邏輯:
- 下拉動(dòng)作;
- 達(dá)到下拉臨界值之后,再請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù);
- 待數(shù)據(jù)加載完成拿到本地以后,才去更新 data source(數(shù)據(jù)源);
B.測(cè)試:
1.先小幅度下拉刷新,正常
2.大幅度下拉刷新,偶爾出現(xiàn)奔潰,App閃退,打印提示:"index 5 beyond bounds for empty array"之類(lèi)
C.原因:
當(dāng)下拉tableview時(shí),當(dāng)超過(guò)一定距離時(shí),最下方的cell肯定會(huì)超出tableview顯示范圍,然后在下拉彈回時(shí),會(huì)調(diào)用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法。
如果在下拉動(dòng)作中將arr清空,那么在tableview彈回調(diào)用此方法時(shí),cell需要從arr中取值,此時(shí)會(huì)崩潰。
所以有人說(shuō)下拉距離短不會(huì)崩潰,距離長(zhǎng)會(huì)崩潰,就是由這個(gè)問(wèn)題引起的。所以才需要在request finished中才清空數(shù)組重新賦值,而不是下拉動(dòng)作中清空。
D.解決:
1.最簡(jiǎn)單暴力的方式就是:清空數(shù)據(jù),立馬reloadData (不推介)
2.網(wǎng)絡(luò)請(qǐng)求成功之后再清空數(shù)據(jù)源,然后再給數(shù)據(jù)源賦值,再去reload.