iOS开发思路:UITableView预加载上拉数据

今天和同事讨论到一个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秒。
然后效果:

iOS开发思路:UITableView预加载上拉数据_第1张图片
Effect.gif

效果不错,当用户滑的快,就会停留在最后并显示下载中;当用户滑的慢,就会在滑动过程中自动加载下面的, 并且整个过程很是流畅!!!

由于时间原因也没有尝试复杂的界面,在这里也算挖个坑,等到真的需要用了并且测试了,再补上。
如果你看到了感兴趣的话,可以写个demo测试一下然后来评论呀(:з」∠)(逃

你可能感兴趣的:(iOS开发思路:UITableView预加载上拉数据)