1.比如上拉刷新会加载更多数据(发送网络请求),如果用户马上下拉刷新去加载最新数据。这样同时就有2个网络请求了。为了更好的用户体验,我们应该在最后一次请求的时候,取消上一次请求。
所以我们需要保存AFHTTPSessionManager对象。
/**
* 管理者
*/
@property(nonatomic,strong)AFHTTPSessionManager *manager;
- (AFHTTPSessionManager *)manager
{
if (!_manager) {
_manager = [AFHTTPSessionManager manager];
}
return _manager;
}
2.那么如何结束之前的请求呢?
// 结束之前的所有请求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
3.在控制器销毁的时候也要结束全部网络请求
/**
* 控制器销毁时调用
*/
- (void)dealloc
{
// 取消所有网络任务
[self.manager invalidateSessionCancelingTasks:YES];
}
4.加载最新数据和加载更多数据的示例代码:
/**
* 加载更多评论
*/
- (void)loadMoreComments
{
// 结束之前的所有请求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
NSInteger page = self.page + 1;
// 准备参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"dataList";
params[@"c"] = @"comment";
params[@"data_id"] = self.topic.ID;
params[@"hot"] = @"1";
params[@"page"] = @(page);
Comment *cmt = [self.latestComments lastObject];
params[@"lastcid"] = cmt.ID;
[self.manager GET:@"https://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 最新评论
NSArray *newComments = [Comment mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
[self.latestComments addObjectsFromArray:newComments];
// 页码
self.page = page;
// 刷新数据
[self.tableView reloadData];
// 控制上拉刷新控件的状态
NSInteger total = [responseObject[@"total"] integerValue];
if (self.latestComments.count >= total) { //全部加载完毕
[self.tableView.mj_footer endRefreshingWithNoMoreData];
}else{
[self.tableView.mj_footer endRefreshing];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 结束下拉刷新
[self.tableView.mj_footer endRefreshing];
}];
}
/**
* 加载更多评论数据
*/
- (void)loadNewComment
{
// 结束之前的所有请求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
// 准备参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"dataList";
params[@"c"] = @"comment";
params[@"data_id"] = self.topic.ID;
params[@"hot"] = @"1";
[self.manager GET:@"https://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 最热评论
self.hotComments = [Comment mj_objectArrayWithKeyValuesArray:responseObject[@"hot"]];
// 最新评论
self.latestComments = [Comment mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
// 页码
self.page = 1;
// 刷新数据
[self.tableView reloadData];
// 结束下拉刷新
[self.tableView.mj_header endRefreshing];
// 控制上拉刷新控件的状态
NSInteger total = [responseObject[@"total"] integerValue];
if (self.latestComments.count >= total) { //全部加载完毕
[self.tableView.mj_footer endRefreshingWithNoMoreData];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 结束下拉刷新
[self.tableView.mj_header endRefreshing];
}];
}
本文介绍了一个iOS应用中网络请求的优化方案,包括如何取消重复请求、管理AFHTTPSessionManager对象,以及在控制器销毁时取消所有网络请求的方法。还提供了加载最新数据和加载更多数据的具体实现代码。
1989

被折叠的 条评论
为什么被折叠?



