今天和同事討論到一個(gè)UITableView的用戶體驗(yàn)優(yōu)化,具體是,在用戶上拉UITableView時(shí)捌锭,當(dāng)?shù)竭_(dá)某一個(gè)點(diǎn)時(shí),自動(dòng)去異步獲取更多的數(shù)據(jù)罗捎,然后在獲得數(shù)據(jù)后主線程刷新观谦。這樣就能讓用戶有一種數(shù)據(jù)刷不完的錯(cuò)覺(jué)。
額桨菜,我們的討論關(guān)鍵在于在獲取到數(shù)據(jù)后豁状,用[self.tableView reloadData];
方法是否會(huì)造成卡頓。
然后倒得,我試著寫(xiě)了一個(gè)小demo泻红,測(cè)試了一下。
在這里霞掺,UITableView
的初始化和數(shù)據(jù)源方法谊路,我都不放上來(lái)了。
- (void)getData
{
_isFetching = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"開(kāi)始請(qǐng)求數(shù)據(jù) 目前有%ld條", self.listArray.count);
sleep(3.0);
for (int i = 0; i<30; i++) {
int random = arc4random() %400;
int height = MAX(60, random);
NSNumber *heightNum = [NSNumber numberWithInt:height];
[self.listArray addObject:heightNum];
}
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"加載了30條 現(xiàn)在一共%ld條\n", self.listArray.count);
_isFetching = NO;
[self.tableView reloadData];
});
});
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (_isFetching == YES) {
return;
}
// 80%出現(xiàn)后菩彬,需要去加載數(shù)據(jù)
if (indexPath.row > self.listArray.count * 0.8) {
[self getData];
}
}
代碼的意思是缠劝,當(dāng)用戶滑到總數(shù)據(jù)的80%處,進(jìn)行獲取數(shù)據(jù)getData
骗灶。當(dāng)獲取到后主線程reloadData
惨恭。這里為了模擬網(wǎng)絡(luò)請(qǐng)求,睡了3秒耙旦。
然后效果:
效果不錯(cuò)脱羡,當(dāng)用戶滑的快,就會(huì)停留在最后并顯示下載中免都;當(dāng)用戶滑的慢锉罐,就會(huì)在滑動(dòng)過(guò)程中自動(dòng)加載下面的,并且整個(gè)過(guò)程很是流暢G倮ァCケ伞!
由于時(shí)間原因也沒(méi)有嘗試復(fù)雜的界面业舍,在這里也算挖個(gè)坑抖拦,等到真的需要用了并且測(cè)試了,再補(bǔ)上舷暮。
如果你看到了感興趣的話态罪,可以寫(xiě)個(gè)demo測(cè)試一下然后來(lái)評(píng)論呀(:з」∠)(逃