2017-03-07 6 views
0

NSUrlConnectionを使用して非同期要求を行う長いコードと、それを処理するためのcompletionHandlerブロックがあります。私は少し前にNSUrlSessionに切り替えましたが、いくつかの小さなエクストラのために、主にそれらが実装において似ていると仮定しました。彼らは両方とも、同じ方法で私のcompletionHandlerブロックを取り出し、完了時にそれを呼び出しました。セットアップは少し異なります。NSUrlConnection - > NSUrlSession;完了時にNSErrorを返さないハンドラエラー

最近、エラーが実際に発生したときにNSUrlSessionがNSErrorをcompletionHandlerブロックに返さないという厄介な問題が発見されました。このユースケースは、通常はNSErrorコード-1012で返されるhttp 401の認証問題です。 NSUrlSessionの場合、NSErrorはnilです。

これは、代理人を使用しているかどうかに関係なく、当てはまります。 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方法:(-1012 401エラーを返さないnserror)

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

思っNSError私の401を取得する:

エラードメイン= NSURLErrorDomainコード= -1012 "(null)" 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

noteから

:NSURLSessionはエラー パラメータを介してサーバのエラーを報告しません。 パラメータでエラーが発生した唯一のエラーは、 ホスト名を解決できない、またはホストに接続できないなど、クライアント側のエラーです。

NSHTTPURLResponseオブジェクトのHTTPステータスコードは、サーバー側エラー によって報告されます。 の詳細については、NSHTTPURLResponseおよび NSURLResponseクラスのドキュメントを参照してください。

関連する問題