1.解决重复请求问题
由于右边的用户列表的数据取决于左边的类别,因此只需要给左边的类别添加一个users属性,用来存储该类别对应的用户数据,只要users值不为空就不必请求数据,值为空,就需要请求数据.
2.网速慢数据还没有回来显示上一个category对应的数据
只需要在点击category时马上刷新列表,这样即使网速较慢也可以刷新当前category对应的数据,等数据回来时再刷新列表即可.
//选中的类别
#define LXXSelectCategory self.categories[self.categoryTableView.indexPathForSelectedRow.row]
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//关注类别列表
if (tableView == self.categoryTableView) {
return self.categories.count;
}else {
return [LXXSelectCategory users].count;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//关注类别列表
if (tableView == self.categoryTableView) {
//取出cell
LXXRecommendCategoryCell *cell = [self.categoryTableView dequeueReusableCellWithIdentifier:LXXCategoryId];
//设置模型
cell.category = self.categories[indexPath.row];
return cell;
}else {
//取出cell
LXXRecommendUserCell *cell = [self.userTableView dequeueReusableCellWithIdentifier:LXXUserId];
LXXRecommendCatory *category = LXXSelectCategory;
//设置模型
cell.user = category.users[indexPath.row];
return cell;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//取出当前的类别模型
LXXRecommendCatory *category = self.categories[indexPath.row];
if (category.users.count) {
[self.userTableView reloadData];
}else {
//马上刷新列表:目的是马上显示当前category的用户数据,不让用户看见上一个 category的残留数据
[self.userTableView reloadData];
// 请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"list";
params[@"c"] = @"subscribe";
params[@"category_id"] = category.id;
// 发送请求
__weak typeof(self) weakSelf = self;
[self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 字典数组 -> 模型数组
NSArray *users = [LXXRecommendUser mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
[category.users addObjectsFromArray:users];
[weakSelf.userTableView reloadData];
[SVProgressHUD dismiss];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[SVProgressHUD dismiss];
}];
}
}
3.请求下一页数据
使用的是第三方的刷新框架mjRefresh,当列表下拉时,调用请求下一页的接口,将请求到的数据添加到用户数组后面,然后刷新列表.
/**
设置刷新控件
*/
- (void)setupRefresh {
self.userTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreUsers)];
self.userTableView.mj_footer.hidden = YES;
}
/**
加载更多用户
*/
- (void)loadMoreUsers {
//获取选中的类别
LXXRecommendCatory *category = LXXSelectCategory;
//发送请求给服务器,加载右侧数据
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"list";
params[@"c"] = @"subscribe";
params[@"category_id"] = category.id;
params[@"page"] = @(++category.currentPage);
//发送请求
__weak typeof(self) weakSelf = self;
[self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 字典数组 -> 模型数组
NSArray *users = [LXXRecommendUser mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
//添加到当前类别对应的用户数组中
[category.users addObjectsFromArray:users];
//保存总数
category.total = [responseObject[@"total"] integerValue];
//刷新列表
[weakSelf.userTableView reloadData];
//如果没有请求到更多的数据,底部显示"已经全部加载完毕"
if (category.total == category.users.count) {
[self.userTableView.mj_footer endRefreshingWithNoMoreData];
}else {
//停止刷新
[self.userTableView.mj_footer endRefreshing];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//提醒
[SVProgressHUD showErrorWithStatus:@"加载用户数据失败"];
//停止刷新
[self.userTableView.mj_footer endRefreshing];
}];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.categoryTableView) {
//取出当前的类别模型
LXXRecommendCatory *category = self.categories[indexPath.row];
//如果有数据,直接刷新列表
if (category.users.count) {
[self.userTableView reloadData];
}else {
//马上刷新列表:目的是马上显示当前category的用户数据,不让用户看见上一个category的残留数据
[self.userTableView reloadData];
category.currentPage = 1;
// 请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"list";
params[@"c"] = @"subscribe";
params[@"category_id"] = category.id;
params[@"page"] = @(category.currentPage);
// 发送请求
__weak typeof(self) weakSelf = self;
[self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 字典数组 -> 模型数组
NSArray *users = [LXXRecommendUser mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
[category.users addObjectsFromArray:users];
//保存总数
category.total = [responseObject[@"total"] integerValue];
//刷新列表
[weakSelf.userTableView reloadData];
//如果数据只有一页,底部显示"已加载完毕"
if (category.total == category.users.count) {
[self.userTableView.mj_footer endRefreshingWithNoMoreData];
}
//隐藏提示框
[SVProgressHUD dismiss];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[SVProgressHUD dismiss];
}];
}
}
}
由于点击左边类别的cell,相应的user数据都显示在同一个tableView上,即一个tableView需要展示若干组不同的数据,同时又可能存在的网络延迟等问题,底部刷新控件的存在很多状态相关问题,譬如控件显示还是消失,显示的文字内容等等,这些细节问题需要很多的条件判断.