在開發(fā)過程中有些界面的接口請求時(shí)間較長.如果用戶不想等待,退出這個(gè)界面,但是界面的請求還在繼續(xù),萬一網(wǎng)絡(luò)很弱,請求超時(shí),就算退出那個(gè)界面也會(huì)彈出超時(shí)報(bào)錯(cuò).如果接口數(shù)據(jù)量大,就會(huì)占用很多內(nèi)存.
所以,要在當(dāng)前界面退出的時(shí)候取消所有的請求.下面與大家分享一下處理方法,有不足之處請小伙伴們幫我指出.謝謝啦~
要取消網(wǎng)絡(luò)請求,就需要一個(gè)類NSURLSessionDataTask的對象方法-cancel.
一:為了方便項(xiàng)目中的使用,建議創(chuàng)建一個(gè)ViewController的根類.你的所有VC都可以去繼承它.調(diào)用父類的方法很方便.下面是VC根類的方法.
#import
#import
@interface BaseViewController :UIViewController
@property(nonatomic,strong)NSURLSessionDataTask*task;
@end
在根類的.h文件中創(chuàng)建一個(gè)屬性,NSURLSessionDataTask*task,他就是用來取消界面的數(shù)據(jù)請求的..m文件的話,小伙伴們可以根據(jù)自己的喜歡,把常用的方法,比如請求數(shù)據(jù)使用的Progress添加到里面,要記得要在.h文件聲明你的方法哦~
二:首先創(chuàng)建兩個(gè)控制器.每個(gè)控制器上都放一個(gè)button.(既然創(chuàng)建根類了,那就這兩個(gè)VC都繼承于上面的BaseViewController吧.)
第一個(gè):
點(diǎn)擊第一個(gè)控制器進(jìn)入第二個(gè)控制器,我們在第二個(gè)控制器里面進(jìn)行網(wǎng)絡(luò)請求.
點(diǎn)擊第二個(gè)控制器的"請求并返回",發(fā)起網(wǎng)絡(luò)請求,并且回到上界面(我是用的是AFN3.0)
- (void)requestData {
AFHTTPSessionManager*manager = [AFHTTPSessionManagermanager];
manager.responseSerializer.acceptableContentTypes= [NSSetsetWithObjects:@"text/html",nil];
NSString*url =@"填寫你使用的url";
//將父類的屬性等于數(shù)據(jù)請求的返回值
self.task= [managerGET:url parameters:nil progress:^(NSProgress*_NonnulldownloadProgress) {
}success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {
NSLog(@"success");
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
NSLog(@"failure, error:%@", error);
}];
[self.navigationControllerpopViewControllerAnimated:YES];//返回上一界面
}
讓它父類的_task屬性等于數(shù)據(jù)請求的返回值.當(dāng)執(zhí)行pop方法的時(shí)候.界面會(huì)執(zhí)行-dealloc方法.在-dealloc方法中處理結(jié)束請求方法.
- (void)dealloc {
if(self.task) {
[self.task cancel];//取消當(dāng)前界面的數(shù)據(jù)請求.
}
}
在此做下判斷,當(dāng)_task創(chuàng)建了,再去取消請求,沒有網(wǎng)絡(luò)請求就不執(zhí)行.
三.當(dāng)我們運(yùn)行的時(shí)候,點(diǎn)擊"請求并返回"按鈕的時(shí)候,會(huì)直接返回上界面,如果請求時(shí)間有點(diǎn)長的話,會(huì)先走-dealloc,當(dāng)取消后,數(shù)據(jù)請求會(huì)直接走failure,并拋出error,Domain=NSURLErrorDomain Code=-999 "cancelled".
當(dāng)不執(zhí)行取消的時(shí)候,點(diǎn)擊按鈕,請求時(shí)間長的話,也是先走-dealloc,但是沒有取消請求,數(shù)據(jù)請求仍會(huì)繼續(xù),當(dāng)請求成功了,會(huì)執(zhí)行success.
此處使用的GET請求,同時(shí)POST請求也可以同樣使用.
好了,以上就是與大家分享的取消界面的網(wǎng)絡(luò)請求.有什么不對的還請大神們指出,多交流一下.3Q