iOS開(kāi)發(fā)之下拉崩潰"index ? beyond bounds for empty array"

前提:(UITableView和UICollectionView等列表控制器刷新),使用MJRefresh第三方框架

A.首先,我們來(lái)先理清邏輯:
  1. 下拉動(dòng)作;
  2. 達(dá)到下拉臨界值之后,再請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù);
  3. 待數(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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容