2011년 2월 24일 목요일

[iOS/Three20] JSON Parser: extThree20JSON

요즘은 데이터 전송 프로토콜이 대체로 XML이나 JSON 두 종류로 굳어가는 것 같다. Three20에서도 이런 request/response모델을 위해 TTURLRequest 모델의 클래스가 있고 여기서 parser로 이용할 수 있는 모듈들이 여러개 있다.

JSON 파서를 이용하기 위해 extThree20JSON이라는 확장모듈을 이용할 수 있다. Three20에 기본적으로 포함되어 있으며 실제 파서는 2종류의 벤더(YAJL/SBLJSON)으로 구성되어 있어서 선택할 수 있다. 벤더는 정적 라이브러리 모듈(.a) 중 어떤 녀석을 링크시킬지도 고르는 형태로 선택한다.

사용하려면 헤더를 추가해 줘야 한다.

#import <extThree20JSON/extThree20JSON.h>

실제로 사용할 때는 TTURLRequest류의 모델에서 Response로 TTURLJSONResponse 를 등록하는 식으로 진행한다. (실제 코드 예제는 샘플의 TTTwitter를 보는게 좋다)

하지만 이게 이전에 이야기 했던 [Three20 프로젝트 만들기]로 해서 사용하려 하면 링크 단계에서 에러가 발생한다. 위에서 이야기 했지만 정적라이브러리 모듈을 링크시키는 등의 여러 작업이 필요하다. 예전에는 extThree20JSON의 프로젝트를 자신의 프로젝트에 집어넣고 링크시킬 라이브러리를 project info에 적어줘야 했다.

하지만 이제는 ttmodule.py의 존재로 인해 커맨드라인 한 줄의 명령으로 쉽게 추가가 가능하다.

python ttmodule경로.../ttmodule.py \
       -p 자신의프로젝트경로.../프로젝트.xcodeproj \
       -c Debug -c Release \
       extThree20JSON:extThree20JSON+YAJL

마지막에 Three20이라고 적던 부분만 바뀌었다. 위의 예는 YAJL 벤더를 사용할 경우이고 SBLJSON을 쓰려면 마지막에 YAJL대신 SBLJSON을 쓰면 된다. 둘의 차이점은 잘 모르겠다 -_-;

이 후 프로젝트를 리로드 하고 빌드해 보면 정상적으로 빌드가 되더라. 안되면 삽질!

그런데 만약 TTURLRequest 모델에서 request를 send할 때 비정상종료가 되는 경우가 발생할 수도 있다. 이유는 잘 모르겠는데 [이 포스팅]에 의하면 project info를 열어서 "Other Linker Flags"항목에 "-all_load"와 "-ObjC"를 추가해 줘야 한다고 한다.


잘 되면 다행. 언제나 이야기 하지만 안되면 삽을 들고 구글신께 기도를...

댓글 2개 :

allieus :

아멘 ~

Seorenn :

하느님 하나님 예수님 마리아님 부처님 관세음보살님 알라님 그리고 구글님 나무관세음보살아멘인샬라~