最近做项目中有一个需求:一个UITableView(UICollectionView)的用户体验优化,具体是在用户上拉UITableView(UICollectionView)时,当到达某一个点时,自动去异步获取更多的数据.
下面使用UICollectionView为例 刷新方法使用到是 MJRefresh框架
@property (nonatomic, assign) BOOL isfinish;//是否可以刷新数据
#pragma mark - loadData 请求数据方法
- (void)loadGoodsList {
NSDictionary *para = @{@"id":self.kindId.length>0 ? self.kindId : @"1",
@"page":@(self.page),
@"sort": @"desc",
@"type":@"1",
@"pageSize": @30
};
[HNRequestManager sendRequestWithRequestMethodType:HNRequestMethodTypeGET requestAPICode:GoodsTypeList refreshCache:NO requestParameters:para success:^(id responseObject) {
DLog(@"分类商品列表: %@", responseObject);
[self.mainCollectionView.mj_header endRefreshing];
[self.mainCollectionView.mj_footer endRefreshing];
if (CODE == 0) {
NSArray *items = [NSArray yy_modelArrayWithClass:[HNProductListModel class] json:responseObject[@"d"][@"goods"][@"items"]];
if (self.page == 1) {
[self.dataArray removeAllObjects];
[self.mainCollectionView.mj_footer resetNoMoreData];
}
[self.dataArray addObjectsFromArray:items];
if (self.dataArray.count == [responseObject[@"d"][@"goods"][@"total"] integerValue]) {//如果我们的数据已经全部加载完毕
self.isfinish = NO;
[self.mainCollectionView.mj_footer endRefreshingWithNoMoreData];
}else{
self.isfinish = YES;
}
[self.mainCollectionView reloadData];
}
}else {
MBErrorMsg;
}
} faild:^(NSError *error) {
[self.mainCollectionView.mj_header endRefreshing];
[self.mainCollectionView.mj_footer endRefreshing];
}];
}
关键:我们在代理方法中的 willDisplayCell 方法中处理问题(UITableView同理方法)
//预加载数据
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0){
if (indexPath.row == self.dataArray.count-5 && self.isfinish) {//当加载到数组到倒数第XXX条时我们开始加载下一页数据
[self footerRefreshing];
}
}
//加载下一页
- (void)footerRefreshing
{ self.page ++;
[self loadGoodsList];
}
经测试在网络正常下,可以明显提升流畅性。
仅个人记录,勿喷。
网友评论