AFNetworking框架的几个细节

本文介绍了一个iOS应用中网络请求的优化方案,包括如何取消重复请求、管理AFHTTPSessionManager对象,以及在控制器销毁时取消所有网络请求的方法。还提供了加载最新数据和加载更多数据的具体实现代码。

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];
    }];

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值