NSURLSession:同步任务挂起

时间:2016-02-18 09:43:44

标签: ios objective-c nsurlsession synchronous

我最近在代码中将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,它为什么不起作用?

1 个答案:

答案 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);

}