프로그래밍/Object-C2012. 3. 25. 14:12
 웹사이트의 RSS를 수집하거나 웹 2.0 사이트들이 제공하는 Open API를 이용하여 개발하려면 HTTP/HTTPS와 같이 널리 알려진 송수신 프로토콜을 이용하게 되는데, iPhone 역시 고수준의 API를 제공하기 때문에 일반적인 경우에는 BSD Socket을 이용하여 저수준의 입출력을 할 필요는 없다. 즉, NSURLRequest나 NSMutableURLRequest를 이용하여 헤더, 쿠기를 지원하면서 HTTP/HTTPS 통신을 손쉽게 할 수 있다.

 HTTP 프로토콜은 Request를 하고 Response를 받는 형태로 서버와 클라이언트 간의 정보를 교환하는 프로토콜이다. iPhone의 API에서도 서버에 데이터를 요청하기 위해 NSURLRequest(또는 NSMutableURLRequest)를 초기화를 하고 이를 NSURLConnection를 경유하여 전송하고 NSURLResponse로 서버가 송신하는 헤더를 받아오고 NSURLConnection의 delegate 메소드로 결과 데이터나 에러처리를 하게 된다.

~.h



~.m

  위의 메소드를 호출하면 비동기로 통신이 되기 때문에 접속만 이상이 없다면 호출 즉시 YES가 반환된다. 현 상태에서는 결과 데이터를 받을 수는 없다. 비동기 통신이라면 결국 콜백함수를 통해 수신된 발생할 때 수신 데이터를 처리할 수 있다. 그렇다면, 콜백함수를 알아보겠다. 물론, Cocoa에서는 델리게이트 메소드라는 용어가 맞겠다.

 

 이 메소드가 호출되는 시점은 서버로의 요청에 대한 반응이라 보면 되겠다. NSURLResponse가 반환되는데 이 과정에서 서버가 클라이언트에 보내는 헤더 정보를 미리 받아볼 수 있다. 이 의미는 앞으로 가져오게될 컨튼츠의 종류(mime type)과 문자셋(char-set)을 미리 확인하고 후에 데이터를 모두 받으면 적절한 디코딩(decode)을 할 수 있도록 하는 데 있다. 예를들어, 서버측에서 UTF-8로 발신을 했는데, 클라이언트측에서는 EUC-KR로 해석하려고 했다면 깨진 데이터만 얻을 뿐이다. 또한, 서버에서 보내는 데이터가 이미지 데이터라면 이미지로 해석하지 않는다면 쓸모없는 데이터가 될 것이다.
 수신되는 데이터는 NSMutableData인 receivedData에 넣게 되는데 여기서는 데이터를 수신받을 준비가 끝났으니 초기화하라는 이야기이다. 또한, 현재 NSURLResponse를 데이터 수신후에 이용해야하기 때문에 인스턴스 변수로 임시 저장한다(self.response = aResponse). NSMutableData의 메모리 할당은 requestUrl 메소드에서 이미 하였다.



 네트워크 상의 데이터는 한 번에 모든 데이터가 전송됨을 보장받을 수 없다. 그래서 수신이 완료될때까지 지속적으로 받아와야 하는데, 이 메소드가 그 역활을 한다. 수신되는 데이터가 있을 때마다 receivedData에 추가하는 것이 그것이다.



 데이터가 전송되다가 네트워크 장애와 같은 에러가 발생할 수 있다. 그런 에러가 발생하면 위의 메소드가 호출이 된다. 위 메소드를 이용하여 에러처리를 할 수 있다. 자원을 해제하고 경고창을 띄운 후 루틴을 종료하는 처리를 하면 된다.



 데이터를 모두 수신하게되면 이 메소드가 호출되는데 여기서는 수신한 NSMutavleData를 적절한 형태의 데이터로 변환하면 된다. 여기서는 HTML 웹페이지를 수신하려 하므로 NSString으로 변환한다. 물론, 문자셋은 헤더로 부터 수신한 문자셋을 참조하여 변환하면 된다.

 

철처 - 날아라x2 종이비행기 블로그
Posted by 건깡