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}少し研究後に発見