오늘의 주제

1. UISearchBarDelegate
2. Daum Open API
3. NSThread
4. JSON parsing (JSONSerialization)



서른 여섯 번째 시간입니다.^^

지난 번에는 계속 포스팅을 위해 이것저것 준비를 해 두었지요?
지난 번 포스팅에 계속 이어지는 포스팅 입니다~
2012/05/30 - [iOS Dev/함께해보기] - iOS개발하기 #35. UISearchDisplayController(1)

오늘은 스레드와 리퀘스트 그리고 JSON 파싱에 대해 중점적으로 진행해 봅니다.

자~ 출발합니다~!


# UISearchBar

일단, 검색바에 검색어를 입력하였을 때, 그리고 검색 버튼은 눌렀을 때 검색을 시작하려고 합니다.
그래서 검색바 델리게이트 레퍼런스로 와서 그에 상응하는 메소드를 가져옵니다.
아래 두 메소드를 클릭해서 전체 메소드를 복사해서 SearchViewController.m 구현파일에 붙여넣어 주세요.


# Daum Open API

그리고 우리가 검색하려는 내용이 도서와 동영상이었습니다. 그래서 다음에 오픈 API를 이용해 보려고 합니다.
http://dna.daum.net/apis/search/book
으로 이동합니다.


일단 API사용을 위해서는 인증키를 받아야 하는데요, 키발급관리 메뉴에서 검색 API의 인증키를 받습니다.


그럼 바로 이렇게 인증키가 발급될거예요~ 창을 닫지 말고 두세요 ㅎ



# NSThread, JSON parsing (JSONSerialization)
 

그리고 이제 우리는 웹으로 데이터 요청을 할텐데요, 그 전에 웹 요청은 스레드로 요청을 하는 것이 좋으므로 스레트 객체 두 개를 선언해 줍니다.


그리고 초기화와 끝내기를 잊지 말아야 겠죠?ㅎ


자, 그리고 본격적으로 오늘의 코딩입니다.
자세한 설명은 코드에 주석으로 달려있는데요, 추가적으로 필요한 설명이 있으면 꼭 댓글주세요~^^*


여기 오류가 하나 있는데요 ㅠㅠ
나중에야 발견해서 캡쳐를 다시 못했네요.
searchBarSearchButtonClicked 메소드에 1, @"pageNum" 을 [NSNumber numberWithInt:1], @"pageNum" 으로 바꿔주세요.
아래 메소드에는 잘 해놓고 위에는 제대로 안되어있네요 ㅠ_ㅠ


코드를 작성하고 실행을 해 봅니다.


그리고 디버그창에 이런 외계어 같은 로그가 남는다면 정상입니다 ㅋ
만약에 result에 에러코드가 떨어진다면 Open API 페이지에 에러코드에 관한 설명이 있으니 참고하세요 ㅎ


자, 오늘은 JSON파싱까지 무사히 해 봤습니다~!

일단은 책 검색까지만 해 봤는데요, 다음번에는 이 정보들을 테이블뷰로 띄워보는 것 까지 해 보려 합니다.

기대해 주세용~_~

질문은 댓글로 주세요^^&


by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



Posted by yagom

댓글을 달아 주세요

  1. 아퐁 2012.06.03 16:12  댓글주소  수정/삭제  댓글쓰기

    다음강의는 커스텀버튼 해주시면 안될까요??
    누르기 전 이미지와, 누른후 이미지를 다르게 설정할수있게요
    부탁드릴게요

  2. 2012.06.15 19:12  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.15 19:46 신고  댓글주소  수정/삭제

      개발문서에 보니 파싱 결과값이 에러가 나오는 것은 에러가 발생하였을 때 발생한다고 합니다.
      결과값 출력로그 부분에 error를 로그 찍어보시면 어떤 에러인지 파악할 수 있지 않을까 사료됩니다...^^
      아니면 데이터값이 잘 받아져 오지 않았을 수도 있을 것 같습니다.
      일단 처음에 json 파싱 전의 데이터가 잘 수신이 되는지 먼저 로그를 찍어 확인해 보세요..^^

      워낙 경우의 수가 많다보니 딱 이거다 라고 말씀드리기가 힘드네요ㅠ_ㅠ
      또 안되면 말씀해 주세요~!

    • 2012.06.17 17:55  댓글주소  수정/삭제

      비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.17 21:17 신고  댓글주소  수정/삭제

      메일주소를 남겨주시면 메일 드리겠습니다..^^

  3. 2012.06.20 13:28  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.20 13:54 신고  댓글주소  수정/삭제

      소스 확인해 보았습니다. :-)
      힌트를 드리겠습니다~!
      딕셔너리 키값은 대소문자를 구분합니다..^^*
      제가 또 밥 좋아하는 건 어떻게 아시고 ㅎㅎㅎ
      살짝 기대해 봅니다 ~_~ㅎㅎ

  4. 2012.06.20 15:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.20 16:20 신고  댓글주소  수정/삭제

      하하~ 네, 정말 간단한거라 대접(?) 받기도 민망하죠~^^;
      정말 꽉 막히는 부분이 생기면 직접 와서 물어보셔도 돼요~ 물론... 제가 거주하는 지역과는 지하철로 4~50분 정도 소요되는 거리지만...^^;ㅎ 잘 해결하신 것 같아 기쁘네요 ㅎ

  5. 나에게넌 2012.08.13 17:48  댓글주소  수정/삭제  댓글쓰기

    무사 통과합니다..강의 감사합니다.

  6. 2013.01.07 18:22  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.07 21:27 신고  댓글주소  수정/삭제

      안녕하세요 :)
      방문 고맙습니다~
      그 부분은 Daum쪽에서 API가 변경되면 변경 될 수도 있는 부분인 것 같습니다 ^^

  7. 블랙덤보 2013.01.29 12:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰선생님 강좌 잘 듣고 있습니다.
    문의 사항이 있어서 댓글달아봅니다.
    잘 구현되지만 검색 시 키보드를 클릭하면 Thread 1: signal SIGABRT 라는 메시지와 함께 다운이 되는데요.
    어떤 문제 일까요? 꼬인 부분이 있는지 다시 프로젝트를 시작했는데도 동일한 증상이 나타납니다.

    항상 강의에 감사드립니다.

    • 블랙덤보 2013.01.29 15:41  댓글주소  수정/삭제

      pageNum 부분을 수정하니 정상 작동이 되는군요....
      강좌 감사드립니다^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.30 08:00 신고  댓글주소  수정/삭제

      선...선생님까지야;;;ㅎ

      들러주셔서 정말 고맙습니다 ㅎ

      해결되셨다니 다행입니다.ㅎ 빨리 답변드리지 못해서 죄송합니다 ㅠ

  8. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.26 15:42 신고  댓글주소  수정/삭제  댓글쓰기

    야곰님 오랜만에 인사드리네요 ^_ㅠ
    몸은 많이 괜찮아 지셨어요?? 빨리 나으셨으면 좋겠어요 ㅠㅠ

    혹시, c#으로 웹서비스 만들어 보셨어요?? -_-.... c#으로 웹서비스 함수 만들고,, 야곰님이 다음 api 호출 하셨던 처럼

    매개변수 이런것들 맞춰서 호출하는데 안되네요 궁시렁궁시렁.......ㅋㅋ 윈도우에서 웹함수 테스트할때는 제이슨 형식으로

    잘 되는데 으흐,,,,,,,,, 혹시 해보신적 있으신가여...? ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.28 10:22 신고  댓글주소  수정/삭제

      음...
      이 저주받은 몸뚱아리가 나아질 생각을 잘 안하네요 ㅠㅠ
      글쎄요... 그 방법은 제가 사용해보지 않아서 딱 어떻게 하라고 말씀을 드리기가 힘드네요 +_+ 죄송합니다..ㅠ

  9. 딴또 2013.03.22 15:19  댓글주소  수정/삭제  댓글쓰기

    감사합니다.

  10. mmbp 2013.04.26 17:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    NSDictionary *bookRequestDic = [[NSDictionary alloc]initWithObjectsAndKeys:[searchBar text], @"key", @"book", @"requestKind",[NSNumber numberWithInt:1], @"pageNum", nil];

    이렇게 고쳤는데도, Thread 1:signal SIGABRT 나오면서 실행이 되지 않습니다 ㅠㅠ

    log창에는 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SearchViewController 0x9176a40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key refreshButtonClicked.'
    *** First throw call stack 이렇게 나오는군요.으앙 해결책을 모르겠습니다ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.04.29 09:01 신고  댓글주소  수정/삭제

      NSDictionary *bookReqeustDic = @{ [searchBar text], @"key", @"book", @reqeustKind", [NSNumber numberWithInt: 1], @"pageNum"}; 으로 바꿔보세요..^^

  11. mmbp 2013.05.03 12:33  댓글주소  수정/삭제  댓글쓰기

    며칠 다른 일 때문에 못 보았습니다.
    NSDictionary *bookRequestDic = @{[searchBar text],@"key",@"book",@"requestKind",[NSNumber numberWithInt:1], @"pageNum"};
    이렇게 바꿨는데, Expected ';' at end of declaration 이라고 나오면서 build failed나와요 ㅠ

    NSDictionary *bookRequestDic = @[[searchBar text],@"key",@"book",@"requestKind",[NSNumber numberWithInt:1], @"pageNum"];
    이렇게 바꾸면 빌드는 되는데, 시뮬레이터에서 ViewController 에서 Search 버튼 누르면 종료되어 버립니다 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.05.03 13:06 신고  댓글주소  수정/삭제

      iOS 버전업이 되어서 맞지 않아 동작하지 않는 것일 수도 있는데요...
      제가 원본 소스를 잃어버려서 지금 테스트를 해 보기가 조금 거시기해요 ㅠㅠ

  12. 김현수 2013.07.05 14:56  댓글주소  수정/삭제  댓글쓰기

    저기...
    테이블뷰 인터페이스빌더에서 생성도 안했는데
    나오는건 뭐죠;;??
    쭉 읽어보고 왔는데
    테이블뷰를 어찌불러오는지 설명이없네요

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.05 15:17 신고  댓글주소  수정/삭제

      UISearchDisplayController는 검색결과가 테이블뷰에 나오는 컨트롤러이기 때문에 따로 테이블뷰를 생성하지 않아도 나오게 됩니다.

      그래서 TableViewDelegate와 DateSource같이 UISearchDisplayController에서 delegate와 dataSource를 가지고 비슷한 처리를 해주죠~

  13. 2013.07.24 14:45  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.25 13:24 신고  댓글주소  수정/삭제

      - (void)searchBarSearchButtonClickedUISearchBar *)searchBar
      메소드는 서치바 델리게이트 메소드로서, 서치바에 검색 버튼을 누르면 동작하는 메소드입니다.
      즉, 검색 버튼을 누르면 위의 메소드가 실행이 되구요,
      이전에

      - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
      메소드는 서치바에 우리가 글자를 입력할 때 호출되는 메소드입니다.

      즉, 우리가 검색창에 텍스트를 입력하면
      - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
      메소드가 호출되고, 그 안에서 검색 준비를 위하여 readyForRequestWithDictionary메소드가 호출이 된 후, 준비가 끝나면 스레드를 통하여 requestSearch 메소드가 호출이 되는거지요.

      델리게이트의 동작방식에 대해 잘 이해가 안가신다면 제 블로그에 포스팅이 있으니 참고하시면 되겠습니다 :)

  14. 프로그래밍구 2013.12.06 02:02  댓글주소  수정/삭제  댓글쓰기

    질문있습니다.

    현재 뷰디드언로드 메세드가 사라졌는데
    쓰레드 관련해서도 메모리해제에 전혀 개발자가 개입하지안해도되나요??

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.12.08 23:53 신고  댓글주소  수정/삭제

      안녕하세요, :)
      프로퍼티만 잘 설정해 주시면 큰 문제는 되지 않을거예요.
      좀 꺼림칙하다 싶으시면 dealloc 메소드를 오버리드해서 구현하시면 됩니다. 다만, [super dealloc] 은 안써주셔도 되구요 ㅎ

  15. 손현 2014.04.04 10:24  댓글주소  수정/삭제  댓글쓰기

    뒤늦게나마 뒷북쳐서 운영자님 죄송합니다..

    질문할게 있어서요.

    코딩을 다 끝냈는데..

    이부분에서 계속 터집니다..ㅜㅜ

    NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:&error];

    -------------------------------------------------------------------------------
    *여긴 오류메세지..ㅠ입니다.

    2014-04-04 10:13:34.804 Parser[988:4c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'

    *** First throw call stack:

    (
    0 CoreFoundation 0x017ee1e4 __exceptionPreprocess + 180

    1 libobjc.A.dylib 0x0156d8e5 objc_exception_throw + 44

    2 CoreFoundation 0x017edfbb +[NSException raise:format:] + 139

    3 Foundation 0x012b3bd2 +[NSJSONSerialization JSONObjectWithData:options:error:] + 67

    4 Parser 0x00002bff -[ViewController requestSearch:] + 847

    5 Foundation 0x011c4a07 -[NSThread main] + 76

    6 Foundation 0x011c4966 __NSThread__main__ + 1275

    7 libsystem_pthread.dylib 0x01f2e5fb _pthread_body + 144

    8 libsystem_pthread.dylib 0x01f2e485 _pthread_struct_init + 0

    9 libsystem_pthread.dylib 0x01f33cf2 thread_start + 34
    )

    libc++abi.dylib: terminating with uncaught exception of type NSException

    (lldb)

    계속 이런 오류가 뜨는데 xcode5로 만들고있습니다.

    뭐가 문제인지 모르겠어요.. response가 계속 nil 값이던데.. 그래서인지..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2014.04.04 15:50 신고  댓글주소  수정/삭제

      response가 nil로 오면 딕셔너리로 변환을 할 수 없기 때문에 익셉션 에러가 발생합니다. response가 nil이 왔다면 요청이 잘못되었을 것 같습니다.