2017-03-07 48 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類的文檔。

相關問題