使用场景
登录用户的Token过期,需要刷新当前用户的Token后再发起后续请求.
实现过程
由于AFNetWorking 3.0的管理类AFHTTPSessionManager
与dispatch_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);