오늘의 주제

1. NSNotificationCenter


서른 네 번째 시간입니다.^^

지난 번에는 델리게이트 프로토콜을 이용하여 데이터를 주고 받는 것을 해 보았습니다.
어떤가요 흥미로우신가요?ㅎ
프로토콜을 사용하여 통신하는 방법도 있지만, iOS에서는 또하나의 흥미로운 기능을 제공합니다.
바로 노티피케이션 센터라는 녀석인데요, 우리가 푸쉬 알림 받는 그 노티피케이션이 아닙니다 ㅎㅎ
그럼 일단 한 번 시작해 보도록 하겠습니다.

그 전에 딕셔너리에 대한 이해가 조금 필요로 합니다.
2012/04/20 - [Objective-C] - Objective C <11>. 딕셔너리, 배열 ( NSDictionary, NSArray )

자 떠나볼까요?ㅎ
고고씽~~~~~~~~~~~~


# NSNotificationCenter?

노티피케이션센터라는 녀석은 어떤 녀석일까요?ㅎ

일단 그 전에, 우리가 다른 객체와 데이터를 주고 받을 수 있는 방법에 대해 잠깐 언급해 보도록 하겠습니다.

첫째로는 직접 주고 받기가 있습니다.
말 그대로 서로 다른 객체를 참조하여 메소드 또는 프로퍼티를 통하여 직접 주고 받는 방법입니다.
여기서 우리는 사용하지 않도록 하겠습니다. 
굉장히 지저분하며, 효율적이지 못하고 이것저것 꼬일 가능성이 크기 때문입니다.
저도 처음 델리게이트 프로토콜이나 노티피케이션에 대해 알지 못했을 때에는 종종 사용했는데, 지금 보면 정말 왜 이모냥으로 만들어 놨나 싶을 정도로 거지같습니다..ㅋㅋ
그러니까 아~ 그런게 있구나~ 정도만 알아두세요 ㅎ

둘째로는 지난 번에 알아보았던 프로토콜을 이용하여 통신하는 방법입니다.
나름 깔끔하고 효율적인 것 같아 보이죠^^

셋째로는 오늘 알아볼 노티피케이션 센터를 통하는 방법입니다.
개인적으로는 가장 깔끔하고 작업능률면에서 효율적이라고 생각합니다.
프로토콜을 이용했을 때에는 어쨋든 내가 그녀석의 델리게이트다, 데이터소스다 라고 선언을 해 주어야 하고, 이것 저것 그래도 손이 가는 편입니다.
그런데 노티피케이션 센터를 통하게 되면 그런 수고를 덜 수 있습니다.
하지만 수고가 덜어지는 만큼 위험도 도사리고 있을 수 있다는 점 명심하세요 ㅎ

자, 그럼 노티피케이션 센터라는 녀석은 무슨짓을 하는가 살펴봅니다~


자, 노티피케이션 센터가 하는 역할입니다.

객체간에 서로 누가 누군지는 전혀 알 수 없습니다만, 노티피케이션 이름만 알고 있다면 노티피케이션 센터에다가 나 이런 노티피케이션을 날렸으니 너가 알아서 처리해! 라고 명령하는 것입니다.

그럼 노티피케이션 센터는 그 해당 노티피케이션을 기다리고 있는 객체에게 해당 명령을 수행하도록 명령하게 되는 것입니다.

대충 감이 오시나요?ㅎ

그럼 한 번 실습을 해봐용 ㅎ



# 실습해보기

자, 일단 먼저 어떤 명령을 수행할 객체 클래스에 노티피케이션 센터에 자신이 할일을 등록하는 것 부터 시작합니다.

우리는 지난 번에 했던 델리게이트 프로토콜 대신에 노티피케이션으로 변경하는 작업을 해볼거예요~ㅎ

ViewController.m으로 옵니다.

처음 로드될 때 노티피케이션 센터에 자신이 할일을 등록해 줍니다.

그리고 주의할 점은 자신이 사라져 해제가 될 때 또는 그 일을 더이상 하지 않아야 할 때, 노티피케이션 센터에 더이상 자신은 일을 하지 않는다고 다시 알려주어야 합니다.

또한, 노티피케이션을 받아서 일을 처리하는 메소드는 꼭 인자를 NSNotification으로 받아와야 합니다. 그래서 지난 번에 사용하던 메소드를 수정할까 새로 만들까 하다가 새로 만들어 주었습니다.ㅎ
이 NSNotification 객체 안에는 몇몇 정보들이 들어가 있습니다.
노티피케이션 이름, 노티피케이션과 관련된 객체, 그리고 userInfo라는 딕셔너리가 포함되어 있습니다.

우리는 데이터를 주로 userInfo라는 딕셔너리를 통하여 전달을 하게 될 것입니다.
그래서 조~ 밑에 노티피케이션 송출 부분에서는 userInfo라는 곳에 딕셔너리를 넣어서 보내줄거예요~

노티피케이션 센터는 우리가 굳이 별도로 만들어 줄 필요는 없습니다. 기본적으로 제공되고 있는 기본 노티피케이션 센터가 있으니 걱정하지 않으셔도 됩니다.

코딩을 해 봅니다 ㅎ


몇 줄 없죠?ㅎ

그런데 사용할 때에는 더 몇줄 없습니다 ㅎㅎ


따지고 보면 수정되는 거는 세줄이네요 ㅎ
지난 번에 사용하였던 프로토콜 호출 부분은 주석처리를 해 두었습니다~!

그리고 실행!!


짜잔~~~~~~
아주 잘 동작하네용 ㅎㅎㅎ

어때요~
참 쉽죠잉?ㅋㅋㅋ

오늘 해본 내용은 꽤나 자주 사용해야 하고, 중요한 부분인데 금방 끝나버렸네요 ㅎㅎ

추가적으로 궁금한 것이 있으면 댓글주세요^^*

그럼 이만, 뿅~!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.06.26 16:03  댓글주소  수정/삭제  댓글쓰기

    활용적인 측면에서는 정말 중요한 내용이라고 생각되지만 구현하는 방법에서 약간 어려운것 같기도 하네요
    어렵다기보다 어디에 활용해야 할지 잘 모르겠다는 뜻이에요.

    데이터의 전달 방법적인 측면도 있지만 해당 액션을 등록해놓고 리시버가 그 액션을 받으면 트리거처럼 이벤트를 발생시켜주는 것 같은 느낌도 드네요 . 여러글을 읽다보니 제 글도 정신이 없네요. 잘 읽고 갑니다.

    설정내용을 저장하는 방법처럼 계속 그 값을 보관해서 여러 뷰에서 사용할 수 있는 방법과는 다른것 같네요.

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

      어디에 활용해야 할지는 제가 오늘 달아드린 댓글 중에도 있겠네요 :-)

      물론 계속 다음 또 다음 포스팅을 읽어가다 보시면 어디서 어떤식으로 써야 할지 조금은 느낌이 올 수 있을 것 같습니다 ^^* 중간중간 제가 사용해 보았거든요..ㅎ

      음... 해당 액션을 등록해 놓고 특정 이벤트가 발생하면 리시버에게 해당 액션을 명령하는 것이 더 맞다고 볼 수 있을 것 같습니다... :-) 물론 보는 관점의 차이와 사용 상황에 따른 차이는 있겠습니다만...^^

      마지막줄에 하신 말씀은 잘 이해를 못하겠네요 ㅠ_ㅠ

      불같은 덧글 고맙습니다...ㅎㅎ

  2. 인절미후후 2012.06.28 15:02  댓글주소  수정/삭제  댓글쓰기

    저의 미천한(읽기 힘든) 댓글에 신성한 댓글 달아주셔서 감사합니다.

    마지막 댓글은 어플내부에 옵션이 있는것들 있잖아요 설정값을 저장해서 가져다 쓰는 경우를 얘기한 것입니다.
    어플들 보면 옵션같은 .. 아직 옵션을 제대로 구현해보지는 않았지만 파일/디비 에 저장해놓고 불러다 쓰는게 맞겠죠.
    아니면 다른 여러 방법이 있기도 하겠지만..

    여러뷰에서 사용한다는 말이 좀 오해를 부른것 같네요.

    제가 요새 정신이 없다보니 .. 글쓸때 한번더 생각해야 겠어요..
    차가운 머리를 하고 글을 적어야 하는데;;

    커뮤니케이션은 개발자의 중요 스킬중 하나라고 생각해요..(패시브)
    야곰님처럼 불같은 감성과 냉철한 이성을 가지고 글을 적으려고 노력하겠습니다!

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

      어이쿠 무슨 말씀을 그리 하십니까...ㅎㅎ
      물론 설정내역 저장은 파일저장 또는 서버저장으로 하는 것이 맞겠죠 ^^
      저도 냉철하지 못해서 자주 실수하곤 합니다 ㅠ_ㅠ
      냉철한 이성과 불같은 감성을 갖추어야 하는데 아직 너무 부족합니다..ㅠ
      어떤 직종이든간에 커뮤니케이션은 정말 중요한 것 같습니다 ㅎ
      항상 덧글 이렇게 주셔서 정말 고맙습니다 :-)
      소통에 게을리 하지 않겠습니다. ㅎ

  3. Sio 2012.07.19 17:52  댓글주소  수정/삭제  댓글쓰기

    확실히 이전 강의인 프로토컬과 델리게이트 쓸때보다 코드도 적고
    간단해 보이기는 하는데 ....
    ㅋㅋ 아직 지식이 부족해서 그런지 어디다 써먹이야 할지는 감이 안오네요
    노티피케이션 관련 소스 같은것도 더 찾아서 뭐에 써먹었었나 봐야겠어요 ㅜㅜ ㅎㅎㅎ
    잘보고 갑니다~~!!

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

      나중에는 아주 유용히 잘 활용하실 날이 올거라 생각합니다 ㅎㅎㅎ
      다음 번에 개발하다가 문득 아! 이런게 있었지! 라는 생각이 들 때가 올지도 모릅니다 ㅎㅎ

  4. 나에게넌 2012.08.13 16:00  댓글주소  수정/삭제  댓글쓰기

    위 서문에 Notification 쓰면 수고가 줄어드는 만큼 위험도 도사린다고 하셨는데..
    어떤 위험이 다가올런지요 ㅎㅎ

    그럼 차라리 delegate를 쓰는게 좀 더 안전한 방법일까요??

    위 댓글처럼 시기적절하게 활용할 수 있다면 코딩실력이 한단계 발전할텐데요.. 그게 어렵네요 ㅎ

    강의 감사합니다..

  5. Favicon of http://koreawolf.tistory.com BlogIcon 안승진 2012.08.17 14:03  댓글주소  수정/삭제  댓글쓰기

    정말 이해하기 쉽게 설명하셨네요.+_+/
    실습하기 전까지만 읽어도 이해가 되어었습니다.. +_+
    다른 사이트 글보다가 이게 뭐 이랬는데 하하;;;

    감사합니다.

  6. 김다오 2013.02.19 18:34  댓글주소  수정/삭제  댓글쓰기

    야곰님 ~ 정말고맙습니다 ㅋㅋㅋㅋ
    정말 유익하네요 ㅋㅋㅋㅋ

  7. 바른생활 2013.04.08 16:43  댓글주소  수정/삭제  댓글쓰기

    어우~~~ 감사합니다.
    C++로 3D를 하는데, 모바일 쪽에서 뭐좀 해볼라치면 자꾸 objective-c가 발목을 잡네요.
    막막했는데 많은 도움이 되었습니다.
    감사합니다.

  8. 에고공 2013.05.08 13:26  댓글주소  수정/삭제  댓글쓰기

    노티피케이션 알아볼려고 돌아다니다가

    http://seonho.blogspot.kr/2012/10/ios-nsnotificationcenter.html
    이 블로그에 위 본문 내용의 스샷이 고대로 들어가있고,
    어떠한 언급도 없는것 같아서.. 알려드려요.
    뭐 나쁜의도겠냐만은..
    그래도 아셔야 할 것 같아서..

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

      안녕하세요 에고공님 :)
      관심 가져주셔서 정말 고맙습니다 ㅎ
      의도가 어찌되었든 말없이 가져가는 것은 옳지 못하지만, 웹이라는 공간의 특성상 어쩔 수 없는 현상이기도 한 것 같습니다 ^^...
      좋게 좋게 쓰인다면 크게 나무랄 것도 없지요..^^

  9. 2013.05.20 21:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  10. dklee7206 2013.05.21 13:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 항상 감사히 잘 보고 있습니다.

    ViewController.m에서
    -(void)setLastAddressWithNoti:(NSNotification *)noti {
    NSDictionary *notiDic = [noti userInfo]; ******< 이걸 만들어주고..
    NSString *lastAddress = [notiDic objectForKey:@"lastAddress"];
    NSLog(@"lastAddress = %@",lastAddress);
    [lastAddressLabel setText:lastAddress];
    }

    ViewControllerforWeb.m에서도


    //noti를 위한 딕셔너리 생성 후 기본 노티피케이션 센터에 노티피케이션 전달
    notiDic에 넣어주는데..>******* notiDic = [[NSDictionary alloc]initWithObjectsAndKeys:lastAddress,@"lastAddress",nil];
    NSLog(@"notiDic : %@", notiDic);


    두 부분이 헷갈리고 이해가 잘 안되서요..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.05.21 18:07 신고  댓글주소  수정/삭제

      ViewController에서는 노티피케이션에 싣고 보낼 데이터(userInfo)를 만들고 노티피케이션을 쏩니다.

      그러면 ViewControllerForWeb에서 노티피케이션을 받고 전달된 데이터(userInfo)를 가져오는 것입니다.

      노티피케이션에 포함되어 전달되는 데이터는 Dictionary 형태가 되어야 하며, Dictionary데이터는 userInfo라는 이름으로 들어옵니다.

      노티피케이션은 특정 상황에서 발송을 할 수 있고, 데이터도 함께 보낼 수 있기 때문에, 특정 상황이 발생했을 때 여러 수신자가 노티피케이션을 받아서 일괄적으로 처리를 할 수 있기 때문에 유용합니다. :)

      윈도우에서는 메세지와 같은 역할이라고 볼 수 있겠습니다...(아마도?)

  11. dklee7206 2013.05.21 21:55  댓글주소  수정/삭제  댓글쓰기

    클래스 중에


    -(void)setLastAddressWithNoti:(NSNotification *)noti {
    NSDictionary *notiDic = [noti userInfo];
    NSString *lastAddress = [notiDic objectForKey:@"lastAddress"];
    NSLog(@"lastAddress = %@",lastAddress);

    [lastAddressLabel setText:lastAddress];

    }

    여기서 [noti userInfo]; 이게 뭘 의미하는지

    [[NSNotificationCenter defaultCenter]postNotificationName:@"setLastAddress" object:nil userInfo:notiDic]; 여기서
    userInfo:notiDic이랑 위에거랑 같이 혼동이 되서 미치겠네요.. ㅠㅠ

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

      변수명이 같아서 혼동이 되시는 것 같은데요.
      postNotification이라는 메소드는 노티피케이션을 송출하는 메소드입니다.

      즉, userInfo로 세팅될 딕셔너리가 notiDic이라는 딕셔너리라는 뜻이구요,

      받는 쪽에서는 노티피케이션에 실려온 userInfo를 꺼내는 것에 불과합니다.

      보내는 쪽과 받는 쪽의 notiDic 변수명을 각각 다르게 하더라도 똑같이 동작을 합니다.

      저것은 객체 자체가 움직이는게 아니고 포인터변수(즉, 객체의 주소)만 옮겨주는 것이기 때문에 변수명은 큰 의미가 없습니다.

      [noti userInfo]를 사용하는 이유는 수신된 NSNotification의 객체인 noti에서 userInfo인 딕셔너리를 꺼내와야 우리가 전달된 데이터를 활용할 수 있는 것이기 때문이죠.

      NSNotification 문서를 보시면 userInfo에 대해 나와있을 거예요.

      저도 처음에 헷갈렸던 부분이기도 합니다 ^^;

      예제 말고 스스로 다른 예제 프로젝트를 만드셔서 직접 여러개 만들어서 노티피케이션을 송출해보고, 받아보는 것을 해보시면 차츰 이해가 되실 거라고 믿습니다 :)

    • dklee7206 2013.05.23 14:20  댓글주소  수정/삭제

      자세히 설명해주셔서 감사합니다 ^^ 이해가 잘 되었습니다.

  12. 2013.05.21 22:02  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      노티피케이션은 수신하고 있는 객체들이 일괄적으로 어떤 일을 처리하고자 할 때 주로 쓰입니다.
      그러니까 노티피케이션을 받는 다른 객체들이 무언가를 실행하기 원할 때 노티피케이션을 송출하게 되는 것이지요.

    • dklee7206 2013.05.23 14:21  댓글주소  수정/삭제

      설명 감사드립니다!

  13. Favicon of http://fldragonn.blog.me BlogIcon 미르룡 2013.07.08 10:37  댓글주소  수정/삭제  댓글쓰기

    ^^ NotificationCenter를 사용할 일이 있었는데 역시 yagom님의 글을 보니 한 번에 이해가 됩니다.
    가장 중요한 핵심을 간단한 그림으로 설명해 주셔서 큰 도움 받았습니다. 항상 좋은 정보 잘 보고 있어요.

  14. nely 2014.03.13 16:55  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다~~~