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);
}
我最近将代码中的 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);
}