NSUrlConnection을 사용하여 비동기 요청을 한 오랫동안 사용해온 코드와이를 처리하기위한 completionHandler 블록이 있습니다. 오래 전에 NSUrlSession으로 전환 한 적이 있지만, 구현시에는 거의 비슷하다고 가정했습니다. 그들은 둘 다 나의 완성을 잡았다 .Handler는 같은 방식으로 블록을 완성하고 완성하자마자 그것을 불렀다. 설정이 약간 다릅니다.NSUrlConnection -> NSUrlSession; 더 이상 NSError를 반환하지 않습니다 .Handler 오류
최근에 나는 오류가 실제로 발생할 때 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 "(널)"사용자 정보 = {_ kCFURLErrorAuthFailedResponseKey = {URL = https://api/blah}}} NSErrorFailingURLKey = https://api/blah} 조금 연구 후에 발견