博客> tableView预先加载下一页功能实现思路
tableView预先加载下一页功能实现思路
2018-04-25 07:52 评论:0 阅读:511 1028958995
ios tableview 滑动 预加载 加载 分页数据

想法:通过屏幕上呈现的cell数进行判断,示例如下(默认每页加载10条数据,每页第5条数据进行预加载处理)

1.在tableView的第三个代理方法中写入一个方法-(void)preload;

- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

/*其他代码*/
[self preload];
/*其他代码*/
return cell;

}

2.在-(void)preload方法中获取当前显示的在屏幕中的cell中下标最大的那个的下标maxIndex

- (void)preload {

NSArray *nowShow = [_dataTableView indexPathsForVisibleRows];
NSInteger maxIndex = 0;//显示在屏幕的最后一行下标+1
for (NSIndexPath *index in nowShow) {
    maxIndex = ((index.row+1)>maxIndex)?index.row:maxIndex;
}    

}

3.当|maxIndex-3|%5==0且总数据还未加载完的时候进行加载处理page++,调用-(void)getHttpData方法;

- (void)preload {

NSArray *nowShow = [_dataTableView indexPathsForVisibleRows];
NSInteger maxIndex = 0;//显示在屏幕的最后一行下标+1
for (NSIndexPath *index in nowShow) {
    maxIndex = ((index.row+1)>maxIndex)?index.row:maxIndex;
}

if (_allCount>10 &&maxIndex<_allCount) { //保证至少有一页
    if ((maxIndex-3)%5==0 ) { //每页第三行进行加载
        page++;
        [self getHttpData];
    }
} 

}

4.这时我们考虑到tableView的代理方法每次滑动都调用,防止在同一个cell上加载两次有必要加一个全局bool值httpLoading和记录本次预加载的cell下标的数组preIndexArr的可变数组

5.当满足  |maxIndex-3|%5==0且总数据还未加载完且preIndexArr数组不包含maxIndex 元素则 httpLoading = yes; 在-(void)preload方法最后赋值lastIndex = maxIndex

- (void)preload {

NSArray *nowShow = [_dataTableView indexPathsForVisibleRows];
NSInteger maxIndex = 0;//显示在屏幕的最后一行下标+1
for (NSIndexPath *index in nowShow) {
    maxIndex = ((index.row+1)>maxIndex)?index.row:maxIndex;
}

if (allCount>10 && maxIndex<allCount/2) { //保证至少有一页 if ((maxIndex-3)%5==0) { //每页的第三行进行预加载 if (PreIndexArr) { BOOL isEqu = YES; //yes表示PreIndexArr数组中没有元素和maxIndex相同 for (int i = 0; i<PreIndexArr.count; i++) { if ([PreIndexArr[i] isEqualToString:[NSString stringWithFormat:@"%ld",(long)maxIndex]]) { isEqu = NO; break; } } if (isEqu) { httpLoading = YES; [PreIndexArr addObject:[NSString stringWithFormat:@"%ld",(long)maxIndex]]; }

        } else {

            httpLoading = YES;
            PreIndexArr = [NSMutableArray arrayWithObject:[NSString stringWithFormat:@"%ld",(long)maxIndex]];
        }

    }

    if (httpLoading) {
        page++;
        [self getHttpData];
    }
}

lastIndex =  maxIndex;

}

6.-(void)getHttpData方法中将httpLoading = no 表示已经请求到数据了,在下一个预加载点上不需要加载数据

- (void)getHttpData {

/*其他代码*/
httpLoading = NO;
/*其他代码*/

请求失败的时候 [PreIndexArr removeLastObject]; }

收藏
1
sina weixin mail 回到顶部