在开发过程中有些界面的接口请求时间较长.如果用户不想等待,退出这个界面,但是界面的请求还在继续,万一网络很弱,请求超时,就算退出那个界面也会弹出超时报错.如果接口数据量大,就会占用很多内存.
所以,要在当前界面退出的时候取消所有的请求.下面与大家分享一下处理方法,有不足之处请小伙伴们帮我指出.谢谢啦~
要取消网络请求,就需要一个类NSURLSessionDataTask的对象方法-cancel.
一:为了方便项目中的使用,建议创建一个ViewController的根类.你的所有VC都可以去继承它.调用父类的方法很方便.下面是VC根类的方法.
#import
#import
@interface BaseViewController :UIViewController
@property(nonatomic,strong)NSURLSessionDataTask*task;
@end
在根类的.h文件中创建一个属性,NSURLSessionDataTask*task,他就是用来取消界面的数据请求的..m文件的话,小伙伴们可以根据自己的喜欢,把常用的方法,比如请求数据使用的Progress添加到里面,要记得要在.h文件声明你的方法哦~
二:首先创建两个控制器.每个控制器上都放一个button.(既然创建根类了,那就这两个VC都继承于上面的BaseViewController吧.)
第一个:
点击第一个控制器进入第二个控制器,我们在第二个控制器里面进行网络请求.
点击第二个控制器的"请求并返回",发起网络请求,并且回到上界面(我是用的是AFN3.0)
- (void)requestData {
AFHTTPSessionManager*manager = [AFHTTPSessionManagermanager];
manager.responseSerializer.acceptableContentTypes= [NSSetsetWithObjects:@"text/html",nil];
NSString*url =@"填写你使用的url";
//将父类的属性等于数据请求的返回值
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属性等于数据请求的返回值.当执行pop方法的时候.界面会执行-dealloc方法.在-dealloc方法中处理结束请求方法.
- (void)dealloc {
if(self.task) {
[self.task cancel];//取消当前界面的数据请求.
}
}
在此做下判断,当_task创建了,再去取消请求,没有网络请求就不执行.
三.当我们运行的时候,点击"请求并返回"按钮的时候,会直接返回上界面,如果请求时间有点长的话,会先走-dealloc,当取消后,数据请求会直接走failure,并抛出error,Domain=NSURLErrorDomain Code=-999 "cancelled".
当不执行取消的时候,点击按钮,请求时间长的话,也是先走-dealloc,但是没有取消请求,数据请求仍会继续,当请求成功了,会执行success.
此处使用的GET请求,同时POST请求也可以同样使用.
好了,以上就是与大家分享的取消界面的网络请求.有什么不对的还请大神们指出,多交流一下.3Q