使用NSURLSession + dispatch_semaphore(信号量)实现同步请求

使用场景

登录用户的Token过期,需要刷新当前用户的Token后再发起后续请求.

实现过程

由于AFNetWorking 3.0的管理类AFHTTPSessionManagerdispatch_semaphore发起同步请求,会引发线程死锁的问题,所以我们这里采用系统自带的NSURLSession请求数据.

实现代码

    // 创建信号量
    dispatch_semaphore_t refreshSem = dispatch_semaphore_create(0);
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"请求地址"]];
    [request setValue:[NSString stringWithFormat:@"token值"] forHTTPHeaderField:@"Authorization"];
    
    NSURLSessionTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
       // 返回数据处理
 
        // 发送信号
        dispatch_semaphore_signal(refreshSem);
    }];
    [dataTask resume];

    // 等待信号
    dispatch_semaphore_wait(refreshSem, DISPATCH_TIME_FOREVER);
    

参考资料

死锁原因:一代真龙
dispatch_semaphore介绍:未之

你可能感兴趣的:(使用NSURLSession + dispatch_semaphore(信号量)实现同步请求)