NSURLSession:同步任务挂起

NSURLSession: Synchronous task hangs

我最近将代码中的 NSURLConnection 替换为 NSURLSession。 由于我正在使用许多同步 url-requests 而 NSURLSession 不支持一个,所以我使用信号量使 NSURLSessionDataTask 同步。 我提到了这个 link:https://forums.developer.apple.com/thread/11519

我有一个单例 'Network Manger',其中 NSURLSession 作为成员变量。 NSURLSession 仅实例化一次并向其添加任务。

但现在同步请求导致我的应用出现性能问题。发送同步请求时有滞后和应用程序挂起。

她是同步请求的调用:

NSURLResponse *urlResponse;
NSError *error;
id serverResponse=[[MyNetworkManager sharedInstance] synchronousDataTaskWithRequest:request
                                                returningResponse:&urlResponse
                                                            error:&error];

如果我不将 NetworkManager 设为单例并每次都实例化它,一切都会完美无缺。

MyNetworkManager *manger=[[MyNetworkManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] responseSerializer:nil];
NSURLResponse *urlResponse;
NSError *error;
id *serverResponse=[manger synchronousDataTaskWithRequest:request returningResponse:&urlResponse error:&error];

备注:

1.Exact 步骤:共有 3 个(2 个异步和 1 个同步)NSURLSessionDataTasks。在第一个任务的完成处理程序中调用第二个异步任务。从第二个完成处理程序调用第三个同步任务。第三个任务被永远阻止,代码不会继续。

2.Everything 正在后台线程上发生。

为什么同步数据任务只有添加到新的NSURLSession才能工作?为什么加到已经执行了2个数据任务的NSURLSession上就不行了?

当我使用信号量进行同步实现时,我遇到了类似的问题,这是该问题的原因:

我认为您的 HTTP 请求导致重定向,并且在 willPerformHTTPRedirection 方法中,您没有为新请求调用 completionHandler。尝试将方法实现为:

- (void)URLSession:(NSURLSession *)session
              task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
        newRequest:(NSURLRequest *)request
 completionHandler:(void (^)(NSURLRequest *))completionHandler
{
    NSLog(@"willPerformRedirection");
    completionHandler(request);

}