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