我有一些使用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}