使用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介绍:未之

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容