1. 程式人生 > >iOS開發 - 關於MJRefresh重新整理崩潰的問題

iOS開發 - 關於MJRefresh重新整理崩潰的問題

關於MJ,行業內恐怕都聽過大名,據博主第一次聽說到使用到現在也有四五年的歷史了,經歷這麼長時間,MJ可謂依然是強盛不衰,很多自定義的重新整理都是通過MJ擴展出來的,博主這裡就不一一解釋了。
早在幾年前,博主剛剛使用MJ的時候就曾碰到過MJ重新整理導致崩潰的問題,但是不怎麼在意,實至今日,又再次使用MJ,也遇到了同樣的問題,先來看看博主是怎麼寫的:

    _circleTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNavigationBarHeight) style:UITableViewStyleGrouped];
    _circleTableView.delegate
= self; _circleTableView.dataSource = self; _circleTableView.estimatedRowHeight = 120; _circleTableView.rowHeight = UITableViewAutomaticDimension; _circleTableView.separatorStyle = UITableViewCellSelectionStyleNone; [self.view addSubview:_circleTableView]; MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self
refreshingAction:@selector(loadNewData)]; // 設定自動切換透明度(在導航欄下面自動隱藏) header.automaticallyChangeAlpha = YES; // 隱藏時間 header.lastUpdatedTimeLabel.hidden = YES; // 設定header self.circleTableView.mj_header = header; self.circleTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self
refreshingAction:@selector(loadMoreData)]; #pragma mark - loadNewData - (void)loadNewData { _page = 1; [_tucaoDataArray removeAllObjects]; [self requestData]; } #pragma mark - loadMoreData - (void)loadMoreData { _page++; [self requestData]; }

乍一看似乎並無不妥,很多人也是這麼用的,但是恰恰是這種寫法使得在重新整理的時候導致陣列越界的崩潰,原因就是在loadNewData方法中還未請求到資料就刪除了資料來源,如果在請求途中tableview滾動,資料來源沒有資料,為空,直接就崩潰了。如果tableview不滾動,也存在一定的機率會崩潰,屬於偶發性的。
最好的做法就是在請求到資料後再刪除資料,存入新資料,不要提前刪除資料。實在是一個低階錯誤。