从服务器拿来的数据时间是倒叙展示的,即
list = (
{
"add_time" = 1621913811;
"add_time_str" = "11:36:51";
"from_type" = 1;
"msg_opt" = (
);
"msg_txt" = "face[\U6cea]face[\U6cea]";
},
{
"add_time" = 1621913307;
"add_time_str" = "11:28:27";
"from_type" = 1;
"msg_opt" = (
);
"msg_txt" = "face[\U7231\U4f60]face[\U7231\U4f60]";
},
{
"add_time" = 1621913294;
"add_time_str" = "11:28:14";
"from_type" = 1;
"msg_opt" = (
);
"msg_txt" = "face[\U9119\U89c6]";
},
第一步 首先逆序遍历,即 先是时间小 -》大(距现在最新的时间) :最小的时间展示isTimeVisible = YES;
if (!self.lastTime ) {
self.lastTime = time;
messageModel.isTimeVisible = YES;
}else{
long timeInterval = [HRDateTransform compareDate:self.lastTime withDate2:time type:2];
if(timeInterval >5){//间隔超过5分钟就显示时间 并赋值lastTime
messageModel.isTimeVisible = YES;
self.lastTime = time;
}
}
[array addObject:messageModel];
//遍历到最后一个时间 self.lastTime 置空 nil;
if(idx == 0){
self.lastTime = nil;
}
第二步 把上一步逆序遍历的数据再次逆序遍历(此时数据回到了最初的状态,时间大的在前)
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
__block HRMessageModel * model = obj;
[self.dataSource insertObject:model atIndex:0];//每次都插到第一个位置 倒叙展示
}];
注意: insertObject:model atIndex:0
这个确保了先把大的放到0位置,然后下一个放到0位置,这样最大的时间(距离现在最近的时间)就被挤到了数组最大的位置,这样tableView展示的时候就把最大时间展示到了最下面的位置
第三步
NSInteger count = [mySelf.dataSource count];
if(page == 1){
NSInteger pageNum = count >1 ? count-1:0;
if(count >0){
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:pageNum inSection:0];
[mySelf.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
}else{
//本页数据总数
NSInteger pageNum = [array count];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:pageNum inSection:0];
[mySelf.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
解析:
page == 1时,第一页数据(每页数据20个)
tableView scrollToRowAtIndexPath:(count-1)
即count-1的位置
page > 1时
tableView scrollToRowAtIndexPath:(array count)
。即第count个的位置
count是该页数据总数。[array count]