今天和同事讨论到一个UITableView的用户体验优化,具体是,在用户上拉UITableView时,当到达某一个点时,自动去异步获取更多的数据,然后在获得数据后主线程刷新。这样就能让用户有一种数据刷不完的错觉。
额,我们的讨论关键在于在获取到数据后,用[self.tableView reloadData];
方法是否会造成卡顿。
然后,我试着写了一个小demo,测试了一下。
在这里,UITableView
的初始化和数据源方法,我都不放上来了。
- (void)getData
{
_isFetching = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"开始请求数据 目前有%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条 现在一共%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%出现后,需要去加载数据
if (indexPath.row > self.listArray.count * 0.8) {
[self getData];
}
}
代码的意思是,当用户滑到总数据的80%处,进行获取数据getData
。当获取到后主线程reloadData
。这里为了模拟网络请求,睡了3秒。
然后效果:
效果不错,当用户滑的快,就会停留在最后并显示下载中;当用户滑的慢,就会在滑动过程中自动加载下面的,并且整个过程很是流畅!!!
由于时间原因也没有尝试复杂的界面,在这里也算挖个坑,等到真的需要用了并且测试了,再补上。
如果你看到了感兴趣的话,可以写个demo测试一下然后来评论呀(:з」∠)(逃
网友评论
但也是一种可能用到情况😁
if (indexPath.row > self.listArray.count * 0.8) {
[self getData];
}