美文网首页面试题
iOS UITableView 上拉加载不使用 reloadD

iOS UITableView 上拉加载不使用 reloadD

作者: 天上飞的狒狒 | 来源:发表于2018-10-31 16:35 被阅读159次

以前做项目的时候没有注意,上拉加载直接往数组中添加新的数据,然后 reloadData,这样固然方便了,但是发现一个问题(以前一直没注意),就是你刷新的时候,会闪一下tableView,虽然没有什么影响,但是闪一下感觉还是怪怪的。后来经过研究大厂的app发现别人不会闪,而是直接在下面就出来了。显然。这样更加好看。

经过研究,发现一种叫做增量加载的方式,能够直接从下面加载,而不闪下。

先上老的代码(有问题的代码)

- (void)loadMoreData {

//我的请求类,大家忽略

    if (!_netManager) {

        _netManager= [[NetWorkManage alloc] init];

    }

//接口

    NSString *serverUrl = @“XXXXXX”;

    NSDictionary *paraDic = @{};

    __weak typeof(self) weakSelf = self;

//请求方法

    [_netManager postWorkWithURl:serverUrl param:paraDic success:^(id object) {

//请求的新的数据

        NSArray *newsListArray = [object objectForKey:@"newsList"];

        if (newsListArray.count > 0) {

            for (NSDictionary *dic in newsListArray) {

             //数据model

                LiveOriginalEntity *e = [LiveOriginalEntity mj_objectWithKeyValues:dic];

                [weakSelf.dataArr addObject:e];

            }

//有新数据之后,直接刷新,这样虽然也是刷新的,但是整个tableview会闪一下,以及整个tabelview会刷新,所以对性能也不是很友好

            [weakSelf.listTableView reloadData];

        }

    } fail:^(NSString *errorMessage) {

//请求失败

    }];

}

-------------------------------------------------------------分割线-------------------------------------------------------------------------------

以下是 上拉加载之后,直接从下面划出数据的加载方法,不闪动,这才是关键

- (void)loadMoreData {

//我的请求类,大家忽略

    if (!_netManager) {

        _netManager= [[NetWorkManage alloc] init];

    }

//接口

    NSString *serverUrl = @“XXXXXX”;

    NSDictionary *paraDic = @{};

    __weak typeof(self) weakSelf = self;

//请求方法

    [_netManager postWorkWithURl:serverUrl param:paraDic success:^(id object) {

//请求的新的数据

//以下是单个分区,上拉加载(一个分区里面上拉加载更多)

        NSArray *newsListArray = [object objectForKey:@"newsList"];

        if (newsListArray.count > 0) {

            NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:0]; //创建一个临时数组

            for (NSDictionary *dic in newsListArray) {

               //数据model

                LiveOriginalEntity *e = [LiveOriginalEntity mj_objectWithKeyValues:dic];

                [tempArray addObject:e];

                [weakSelf.dataArr addObject:e];

            }

            NSMutableArray *insertInexPaths = [NSMutableArray arrayWithCapacity:[tempArray count]];  //创建一个临时数据存放indexpath

            for (NSInteger i = 0; i< tempArray.count; i++) {

             // 取出后面需要加入的indexPath放进刚刚的那个临时数组

                NSIndexPath *newPath = [NSIndexPath indexPathForRow:[weakSelf.dataArr indexOfObject:[tempArray objectAtIndex:i]] inSection:0];

                [insertInexPaths addObject:newPath];

            }

           //把新的数据插入到后面

            [weakSelf.listTableView insertRowsAtIndexPaths:insertInexPaths withRowAnimation:(UITableViewRowAnimationFade)];

        }

//如果是上拉加载更多分区,上拉加载(插入更多的分区)则使用以下代码

        if (newsListArray.count > 0) {
            NSMutableArray *tempArray = [NSMutableArray array];
            NSInteger beforeCount = weakSelf.dataArr.count;
            for (NSInteger i = 0; i< listArr.count; i++) {
                NSDictionary *contentDic = [newsListArray objectAtIndex:i];
                RecommandEnity *e = [RecommandEnity mj_objectWithKeyValues:contentDic];
                [tempArray addObject:e];
                [weakSelf.dataArr addObject:e];
            }

// 插入分区

           [weakSelf.listTableView insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(beforeCount, tempArray.count)] withRowAnimation:UITableViewRowAnimationFade];
//            [weakSelf.listTableView reloadData];
        }

    } fail:^(NSString *errorMessage) {

    //请求失败

    }];

}

如有不当之处,请多多指教。谢谢!

相关文章

网友评论

    本文标题:iOS UITableView 上拉加载不使用 reloadD

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