在进行新的网络请求的时候,把之前的http请求取消掉,
保证同一时间只有一个http请求在执行
AFNetWorking为例
大致思路:声明一个全局的 AFHTTPSessionManager *manager;
再声明一个全局的可变数组用于存放 http请求。
进行http请求的时候,一定要创建一个新的 NSURLSessionDataTask
任务
再[task cancel]之后,并不是说这个http请求就完全没有任何音讯了
task会立刻回掉 error,NSLog(@"error:%@",error.description)
可以打印log消息看到Code=-999 “已取消”
@property (nonatomic,strong) AFHTTPSessionManager *manager;
@property (nonatomic,strong) NSMutableArray *taskArray;
#pragma mark -- taskArr
-(NSMutableArray *)taskArray{
if (!_taskArray) {
_taskArray = [NSMutableArray arrayWithCapacity:3];
}
return _taskArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
//初始化 AFHTTPSessionManager 并且设置配置信息,在这不做多述
self.manager = [AFHTTPSessionManager manager];
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
}
-(void)loadDataWithSearchStr:(NSString *)searchStr{
//首先遍历存放task的数组,并且取消之前的http请求
[self.taskArray enumerateObjectsUsingBlock:
^(NSURLSessionDataTask *task, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"这个任务取消之前的状态是:::::%ld",task.state);
[task cancel];//取消http请求
NSLog(@"这个任务取消之后的状态是:::::%ld",task.state);
}];
//移除self.taskArray中所有的任务
[self.taskArray removeAllObjects];
//创建一个新的NSURLSessionDataTask,记住,一定是新创建一个任务
NSURLSessionDataTask *newTask = [self.manager GET:@"你的接口url"
parameters:nil progress:nil success:
^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
//在这里处理数据
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
//把最新的任务存进self.taskArray,用于下次遍历
[self.taskArray addObject:newTask];
}
网友评论