2017-12-19 2 views
1

NSHTTPURLResponse 상태 코드를 읽으려고 시도하지만 NSHTTPURLResponse은 nil을 반환하지만 NSError은 생성되지 않습니다.NSHTTPURLResponse는 Null이지만 NSError가 생성되지 않습니다.

은 iOS 11보다 먼저 작동하지만 더 이상 사용되지 않으며 온라인에서 NSURLSession을 참조 할 수 없음을 경고하지 않습니다.

왜 그런가?

나는 일반적으로 아래의 방법 [MyClass getHTTPResponseRequest:@"http://www.google.com/"];

+ (NSInteger) getHTTPResponseRequest : (NSString*) testURL { 
    __block NSHTTPURLResponse * r = nil; 

    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:testURL] 
           completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

       if (error) { 
        NSLog(@"Error %@", error.localizedDescription); 
       } 

       r = (NSHTTPURLResponse *)response; 

    }] resume]; 

    if(r == nil){ 
     NSLog(@"Response is nil"); 
     return 9999; 
    } 

    return r.statusCode; 
} 

답변

1

이 중 아이폰 OS (11) 이전에 일을하지 않았을에게 문의하십시오. dataTaskWithURL 완료 핸들러는 비동기 적으로 호출되지만 statusCode을 반환하기 전에 요청이 완료 될 때까지 기다리지 않아도됩니다.

비동기 패턴을 사용해야합니다.

+ (void)getHTTPResponseRequestWithURL:(NSString *)urlString completion:(void(^ _Nonnull)(NSInteger))completion { 
    NSURL *url = [NSURL URLWithString:urlString]; 

    [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     if (error) { 
      NSLog(@"Error %@", error.localizedDescription); 
     } 

     NSInteger statusCode; 
     if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
      statusCode = [(NSHTTPURLResponse *)response statusCode]; 
     } else { 
      statusCode = 9999; 
     } 

     completion(statusCode); 
    }] resume]; 
} 

을 그리고 당신은 그것을 호출 것 같은 : : 자신을 완료 핸들러 패턴을 사용

[MyClass getHTTPResponseRequestWithURL:@"http://google.com" completion:^(NSInteger statusCode) { 
    // examine the `statusCode` here 

    NSLog(@"%ld", (long)statusCode); 
}]; 

// but the above runs asynchronously, so you won't have `statusCode` here 

을 이제 명확하게 완료 핸들러의 매개 변수는 일반적으로 단지 정수 statusCode보다 더 의미있는 무언가를 반환하는,하지만 보여 아이디어 : 비동기 패턴 (예 : 완료 핸들러)을 사용하지 않고 비동기 메소드에서 값을 리턴하려고하지 마십시오.

+0

고마워요! 나에게 새로운 패턴을 보여주고 시간을내어 주셔서 감사합니다! –

관련 문제