iOS開發 - 關於MJRefresh重新整理崩潰的問題
阿新 • • 發佈:2019-01-10
關於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不滾動,也存在一定的機率會崩潰,屬於偶發性的。
最好的做法就是在請求到資料後再刪除資料,存入新資料,不要提前刪除資料。實在是一個低階錯誤。