2017-03-07 22 views
0

我有一些使用NSUrlConnection创建异步请求的长期代码和一个completionHandler块来处理它。不久前我转向NSUrlSession,为了一些小的额外功能,但主要假设它们在实现方面相似。他们都以同样的方式占用了我的完成处理程序块,并在完成时调用它。该设置有点不同。NSUrlConnection - > NSUrlSession;不再为完成处理程序错误返回NSError

最近我发现了一个令人不安的问题,即当实际发生错误时,NSUrlSession没有将NSError返回给completionHandler块。该用例用于HTTP 401身份验证问题,该问题通常以NSError代码-1012返回。对于NSUrlSession,NSError为零。

无论我是否使用委托,这都是真的。而didFailWithError委托也没有被返回。

为什么NSUrlSession不会返回这个错误?

void (^connectionCompletionHandlerBlock)(NSData *data, NSURLResponse *response, NSError *error) = ^(NSData *data, NSURLResponse *response, NSError *error){ 
    if(error){ 
     // handle error 
     if(error.code == -1012){ // such as http 401 login error 
     // auth error 
     } 
    } else { 
     // no error 
    } 
} 

NSString *url = @"http://blahblah.com"; 
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 

// configure urlRequest with params, etc 

NSURLConnection的方式:(nserror -1012返回401错误)

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:connectionCompletionHandlerBlock]; 

NSUrlSession方式:(无nserror -1012返回401错误)

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:urlRequest completionHandler:connectionCompletionHandlerBlock]; 
[task resume]; 

的NSError我的预期以获得我的401:

错误域= NSURLErrorDomain代码= -1012“(空)”UserInfo = {NSError FailingURLStringKey = https://api/blah,NSUnderlyingError = {0x600004047890误差区域= kCFErrorDomainCFNetwork代码= -1012 “(空)” 的UserInfo = {_ kCFURLErrorAuthFailedResponseKey = {URL = https://api/blah}}},NSErrorFailingURLKey = https://api/blah}

回答

1

一个小小的研究之后发现的。 NSUrlSession不会按设计返回服务器端错误。

NSUrlSession Apple documentation

注:NSURLSession不通过错误 参数报告服务器错误。您的应用程序通过错误 参数收到的唯一错误是客户端错误,例如无法解析主机名或连接到主机。

服务器端错误通过 报告NSHTTPURLResponse对象中的HTTP状态代码。有关更多 信息,请阅读NSHTTPURLResponse和 NSURLResponse类的文档。

相关问题