通過AFN來做網(wǎng)絡(luò)請(qǐng)求,有可能在網(wǎng)絡(luò)比較慢的時(shí)候,請(qǐng)求結(jié)果還沒回來,但是此時(shí)用戶已經(jīng)退出了這個(gè)控制器,也就是說這個(gè)控制器已經(jīng)被銷毀了,但是請(qǐng)求還在繼續(xù),當(dāng)網(wǎng)絡(luò)請(qǐng)求結(jié)果回來以后,在請(qǐng)求成功和失敗的Block里面都會(huì)調(diào)用self(也就是銷毀的那個(gè)控制器)的一些方法,但是控制器已經(jīng)被銷毀了,這個(gè)時(shí)候就會(huì)Crash,所以為了防止這種情況,就要在控制器銷毀的時(shí)候把正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求全部取消掉,這樣就不會(huì)繼續(xù)進(jìn)行請(qǐng)求了。
/**?AFN請(qǐng)求管理者?*/
@property(nonatomic,strong)AFHTTPSessionManager *manager;
-?(AFHTTPSessionManager*)manager
{
if(!_manager)?{
_manager?=?[AFHTTPSessionManager manager];
}
return_manager;
}
-?(void)loadData
{
//?顯示指示器
[SVProgressHUD ? showWithMaskType:SVProgressHUDMaskTypeBlack];
//?發(fā)送請(qǐng)求
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
{
//?停止所有請(qǐng)求
[self.manager.operationQueue ?cancelAllOperations];
}
請(qǐng)求的時(shí)候全部用成員變量manager來進(jìn)行請(qǐng)求,請(qǐng)求完成后對(duì)manager的操作隊(duì)列進(jìn)行全部取消操作即可
如果控制器內(nèi)請(qǐng)求較多可以設(shè)置一個(gè)可變字典將所有請(qǐng)求加入字典,不需要時(shí)(注意不是dealloc方法)根據(jù)請(qǐng)求的URL或參數(shù)找到對(duì)應(yīng)的請(qǐng)求取消即可