通過AFN來做網(wǎng)絡(luò)請求蚯窥,有可能在網(wǎng)絡(luò)比較慢的時(shí)候沿盅,請求結(jié)果還沒回來痊土,但是此時(shí)用戶已經(jīng)退出了這個(gè)控制器肄扎,也就是說這個(gè)控制器已經(jīng)被銷毀了,但是請求還在繼續(xù)赁酝,當(dāng)網(wǎng)絡(luò)請求結(jié)果回來以后犯祠,在請求成功和失敗的Block里面都會調(diào)用self(也就是銷毀的那個(gè)控制器)的一些方法,但是控制器已經(jīng)被銷毀了酌呆,這個(gè)時(shí)候就會Crash衡载,所以為了防止這種情況,就要在控制器銷毀的時(shí)候把正在進(jìn)行的網(wǎng)絡(luò)請求全部取消掉隙袁,這樣就不會繼續(xù)進(jìn)行請求了痰娱。
/**?AFN請求管理者?*/
@property(nonatomic,strong)AFHTTPSessionManager *manager;
-?(AFHTTPSessionManager*)manager
{
if(!_manager)?{
_manager?=?[AFHTTPSessionManager manager];
}
return_manager;
}
-?(void)loadData
{
//?顯示指示器
[SVProgressHUD ? showWithMaskType:SVProgressHUDMaskTypeBlack];
//?發(fā)送請求
NSMutableDictionary*params?=?[NSMutableDictionarydictionary];
[self.manager GET:@"http://www.baidu.com" parameters:nil:^(NSURLSessionDataTask*task,idresponseObject)?{
//?隱藏指示器
[SVProgressHUD dismiss];
//?服務(wù)器返回的JSON數(shù)據(jù)
//?刷新表格
}failure:^(NSURLSessionDataTask*task,NSError*error)?{
//?顯示失敗信息
[SVProgressHUD showErrorWithStatus:@"加載信息失敗!"];
}];
}
#pragma?mark?-?控制器的銷毀
-?(void)dealloc
{
//?停止所有請求
[self.manager.operationQueue ?cancelAllOperations];
}
請求的時(shí)候全部用成員變量manager來進(jìn)行請求弃榨,請求完成后對manager的操作隊(duì)列進(jìn)行全部取消操作即可
如果控制器內(nèi)請求較多可以設(shè)置一個(gè)可變字典將所有請求加入字典,不需要時(shí)(注意不是dealloc方法)根據(jù)請求的URL或參數(shù)找到對應(yīng)的請求取消即可