http请求取消掉,保证同一时间只有一个http请求在执行

在进行新的网络请求的时候,把之前的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];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。