控制器销毁时取消网络请求,防止Crash!

当进行一些网络请求时,一般都是通过AFN来做的,有可能在网络比较慢的时候,请求结果还没回来,但是此时用户已经退出了这个控制器,也就是说这个控制器已经被销毁了,但是请求还在继续,当网络请求结果回来以后,在请求成功和失败的Block里面都会调用self(也就是销毁的那个控制器)的一些方法,但是控制器已经被销毁了,这个时候就会Crash,所以为了防止这种情况,就要在控制器销毁的时候把正在进行的网络请求全部取消掉,这样就不会继续进行请求了。
/** AFN请求管理者 */
@property (nonatomic, strong) AFHTTPSessionManager *manager;
- (AFHTTPSessionManager *)manager
{
    if (!_manager) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}

- (void)loadCategories
{
    // 显示指示器
    [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];
    
    // 发送请求
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"category";
    params[@"c"] = @"subscribe";
    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
        // 隐藏指示器
        [SVProgressHUD dismiss];
        
        // 服务器返回的JSON数据
        self.categories = [XMGRecommendCategory objectArrayWithKeyValuesArray:responseObject[@"list"]];
        
        // 刷新表格
        [self.categoryTableView reloadData];
        
        // 默认选中首行
        [self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
        
        // 让用户表格进入下拉刷新状态
        [self.userTableView.header beginRefreshing];
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        // 显示失败信息
        [SVProgressHUD showErrorWithStatus:@"加载推荐信息失败!"];
    }];
}

#pragma mark - 控制器的销毁
- (void)dealloc
{
    // 停止所有操作
    [self.manager.operationQueue cancelAllOperations];
}

代码如上面所示,请求的时候全部用成员变量manager来进行请求,请求完成后对manager的操作队列进行全部取消操作即可!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue 项目中,可以通过 Vue 的生命周期钩子函数 `beforeDestroy` 来取消上一次接口请求。在 `beforeDestroy` 钩子函数中,可以调用取消请求的方法,例如使用 Axios 的 `cancel` 方法来取消请求。 下面是一个示例代码: ```javascript import axios from 'axios'; export default { data() { return { request: null, // 保存请求的变量 }; }, methods: { fetchData() { // 取消上一次请求 if (this.request) { this.request.cancel('取消上一次请求'); } // 发起新的请求 this.request = axios.CancelToken.source(); // 创建 cancel token axios.get('/api/data', { cancelToken: this.request.token }) .then(response => { // 处理响应数据 }) .catch(error => { if (axios.isCancel(error)) { console.log('请求取消', error.message); } else { console.log('请求发生错误', error); } }); }, }, beforeDestroy() { // 在页面销毁取消请求 if (this.request) { this.request.cancel('组件销毁取消请求'); } }, }; ``` 在这个示例中,我们通过创建一个 CancelToken 对象来生成一个 cancel token,并将其传递给 Axios 的 `cancelToken` 配置项。当需要取消请求,调用 `cancel` 方法,并传递取消原因。 在 `beforeDestroy` 钩子函数中,我们通过判断是否存在请求对象来决定是否取消请求。当组件即将销毁,会调用 `beforeDestroy` 钩子函数,此可以取消上一次的请求。 请注意,这里使用的是 Axios 库作为示例,实际项目中可能使用的是其他 HTTP 请求库,取消请求的方法可能会有所不同。具体使用方法请参考对应库的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值