2014-04-17 17 views
3

나는 애플의 NSURLSession # dataTaskWithURL 방법과 간단한 GET 요청을 수행하고하는 것은dataTaskWithURL의 NSURLResponse에서 상태 코드를 어떻게 가져 옵니까?

[[mySession dataTaskWithURL:myUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    // fancy code goes here... 
}] resume]; 

나는 상태 코드가 성공 된 경우 일을 할 수있는 조건을 갖고 싶어, 내가 같이 NSURLResponse 캐스팅해야 할 것으로 보인다 NSHTTPURLResponse .....

NSUInteger statusCode = ((NSHTTPURLResponse *)response).statusCode; 
    if (!error && statusCode == 200) { 
     // even fancier code goes here 
    } else { 
     // omg!!!!!!!!! 
    } 

...

그러나 ---------- 내 질문은 : 왜!?!?!?!?!?!?! ?

왜 애플은 자신의 상태를 모르는 유형에 캐스팅 된 응답 객체를 전달할 것입니까?! 이 코드를 작성해야한다는 사실로 인해 나는 아주 잘못된 것을하고 있다고 생각하게되었고, 그것이 200, 404, 500인지 알 수있는 더 좋은 방법이 될 것입니다 ...

나는 completionHandler의 블록 인수 유형을 NSHTTPURLResponse로 변경할 수 있습니다. 그러나 그럴 필요는 없습니다.

답변

7

프로토콜 설계가 잘 수행된다면 항상 미래에 주목해야합니다.

we're only using NSURLSession for HTTP right now이지만 다른 네트워킹 프로토콜에도 사용할 수 있습니다. 예를 들어 어느 시점에서 FTP 용으로 사용할 수 있다면 놀라지 않을 것입니다.

완료 블록/위임 매개 변수에 대한 간단한 응답 기본 클래스를 사용하고 사용중인 네트워크 프로토콜 종류에 기반하여 캐스트하면 향후 NSURLSession 유연성이 향상됩니다.

새로운 네트워킹 프로토콜이 다른 필요성과 함께 나타나면 어쩌면 의 응답에 정수 상태 코드가 없습니다. 예를 들어 Apple은 NSURLResponse의 다른 하위 클래스를 추가 할 수 있습니다. 완료 처리기 블록의 서명 및 모든 NSURLSession*Delegate 프로토콜

NSHTTPURLResponse을 사용하기 위해 네트워크 프로토콜과 완료 처리기 블록을 "하드 코딩"했다면 NSURLSession에 FTP와 같은 새로운 네트워크 프로토콜을 어떻게 추가할까요?

(NB : "네트워킹 프로토콜"과 반대되는 "프로토콜"로 -이 대답에서 두 용어를 모두 사용합니다. 실제 protocols 및 이와 동등한 완료 핸들러를 포함하여 NSURLSession 클래스의 인터페이스 디자인을 의미합니다.)

0

응답에서 NSHTTPURLResponse의 인스턴스를 형변환하고 statusCode 메서드를 사용하십시오.

[NSURLConnection sendAsynchronousRequest:myRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
    NSLog(@"response status code: %ld", (long)[httpResponse statusCode]); 
    // do stuff 
}]; 
+0

롤 와우 복사 믿고 그냥 같은 다른 대답을 붙여 넣을 수 없습니다 ... http://stackoverflow.com/a/25431043/1474817 – emotality

+2

@emotality : SO 공유를위한 플랫폼이다. 이 질문의 존재는 다른 대답이 충분히 보이지 않았 음을 보여줍니다. 그래서 여기에 가져 왔어. 이제 보았으니, '믿는다'. – Nishant

+0

축하해. 당신 자신의 대답을주세요. 전형적으로 복사본과 깔끔합니다. – emotality