美文网首页iOS进阶之路iOS Developer实用工具
iOS开发思路:UITableView预加载上拉数据

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

作者: Jabber_YQ | 来源:发表于2017-08-17 11:09 被阅读1865次

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

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

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

    相关文章

      网友评论

      • 思念那年慕云:如果用户只需要看一页数据,而且加载比较耗流量时,这个方法就不友好了,
        但也是一种可能用到情况😁
        Jabber_YQ:这个只是一种实现的思路:relaxed: 如果不需要该需求完全可以不使用呀
      • 冉俊:抱歉没有注意_isFetching判断
      • 冉俊:80%就会加载,81%不是也要加载?

        if (indexPath.row > self.listArray.count * 0.8) {
        [self getData];
        }
        超_iOS:你说的对啊
      • PotterSun:不错

      本文标题:iOS开发思路:UITableView预加载上拉数据

      本文链接:https://www.haomeiwen.com/subject/gbygrxtx.html