最近在收集App測(cè)試Bug問題時(shí)發(fā)現(xiàn)一個(gè)問題,就是在執(zhí)行下面這兩句代碼是造成了程序閃退:
[self.tableView reloadData];
[self.tableView yg_scrollToRow:0 inSection:0 atScrollPosition:UITableViewScrollPositionNone animated:YES];
閃退信息:
-[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:usingPresentationValues:]: row (0) beyond bounds (0) for section (0).
(null)
很明顯是因?yàn)閇tableView reloadDate]并不會(huì)等待tableview更新結(jié)束后才返回锣披,而是立即返回妖碉,然后去計(jì)算表高度馒疹,獲取cell等。如果表中的數(shù)據(jù)非常大声旺,在一個(gè)run loop周期沒執(zhí)行完,這時(shí),需要tableview視圖數(shù)據(jù)的操作就會(huì)出問題了贮缕。
有以下兩種解決方法:
1.強(qiáng)制刷新
[self.tableView reloadData];
[self.tableView layoutIfNeeded]; // 強(qiáng)制重繪并等待完成
[self.tableView yg_scrollToRow:0 inSection:0 atScrollPosition:UITableViewScrollPositionNone animated:YES];
2.線程等待
[self.tableView reloadData];
// reloadDate會(huì)在主隊(duì)列執(zhí)行,而dispatch_get_main_queue會(huì)等待機(jī)會(huì)俺榆,直到主隊(duì)列空閑才執(zhí)行感昼。
dispatch_async(dispatch_get_main_queue(), ^{
//刷新完成
[self.tableView yg_scrollToRow:0 inSection:0 atScrollPosition:UITableViewScrollPositionNone animated:YES];
});