当进行一些网络请求时,一般都是通过AFN来做的,有可能在网络比较慢的时候,请求结果还没回来,但是此时用户已经退出了这个控制器,也就是说这个控制器已经被销毁了,但是请求还在继续,当网络请求结果回来以后,在请求成功和失败的Block里面都会调用self(也就是销毁的那个控制器)的一些方法,但是控制器已经被销毁了,这个时候就会Crash,所以为了防止这种情况,就要在控制器销毁的时候把正在进行的网络请求全部取消掉,这样就不会继续进行请求了。
代码如上面所示,请求的时候全部用成员变量manager来进行请求,请求完成后对manager的操作队列进行全部取消操作即可!
/** 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的操作队列进行全部取消操作即可!