我最近在代码中将NSURLConnection
替换为NSURLSession
。
由于我使用了许多同步网址请求而NSURLSession
不支持,我使用信号量使NSURLSessionDataTask
同步。
我引用了这个链接:https://forums.developer.apple.com/thread/11519
我有一个单独的'网络管理器',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.确切步骤:共有3个(2个异步和1个同步)NSURLSessionDataTasks
。在第一个任务的完成处理程序中调用第二个异步任务。从第二个完成处理程序调用第三个同步任务。第三个任务永远被阻止,代码不会继续。
2.一切都发生在后台主题上。
为什么同步数据任务只有在添加到新NSURLSession
时才有效?如果添加到已执行两个数据任务的NSURLSession
,它为什么不起作用?
答案 0 :(得分:1)
当我习惯使用Semaphore进行同步实现时,我遇到了类似的问题,这就是导致该问题的原因:
我认为您的HTTP请求导致重定向,而在willPerformHTTPRedirection
方法中,您还没有为新请求调用completionHandler。尝试将方法实现为:
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest *))completionHandler
{
NSLog(@"willPerformRedirection");
completionHandler(request);
}