在我们开发过程中,经常遇到当控制器销毁的时候,http应该取消的情况,实际上,很多人都没有注意到,当控制器销毁的时候,请求并没有取消,导致数据显示异常的情况。
我使用的基本afnetworking框架进行封装的,其中区分get和post请求,使用字符串分离的方法,进行区分是get和post方法。封装网络请求方法。
首先,先“@”分离字符,因为apiPath=@“login@get”或者apiPath=@“login@post”进行区分的
NSArray *array = [apiPath componentsSeparatedByString:@“@”];
然后在
- (NSURLSessionTask*)requestData:(NSString*)apiPath
parent:(BaseViewController*)parent
param:(NSDictionary*)param
class:(Class)class
success:(HttpResponseSuccess)success
failed:(HttpResponseFail)failed{
进行调用afnetworking的函数
}
这个函数中,要session = [[HttpManagesharedInstance].managerGET:urlparameters:dicprogress:^(NSProgress*_NonnulldownloadProgress),这个session要保存在当前类的数组中,当请求完成时候,要记得,从当前数组中把这个session变量移除了,同时要创建一个NSObject的分类,进行同步取消的,其中注意,这个session也要保存NSObject创建的分类中数组保存,当在请求完成时,也要在分类中去掉这个session,取消的时候,要这样写
[temp.arrayenumerateObjectsUsingBlock:^(HttpCancelRequest*_Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop) {
NSURLSessionTask*task = obj.request;
if(task.taskIdentifier== sess.taskIdentifier){
*stop =YES;
if(*stop ==YES) {
[temp.arrayremoveObject:obj];
}
}
}];
如果不这样写,会造成数据移除不同步,这个block自动做了数据同步。
在分类中,要重新- (void)dealloc{
[self cancelAllRequest];
}这个方法。这个只是一个思路,因为目前项目中,正在使用,不方便开源。
网友评论