Notification Center를 공부하자

7과11사이·2024년 3월 14일
1
post-custom-banner

부트캠프에서 코드를 짤 때 Notification Center을 활용해서 키보드 등장 유무에 따라 뷰가 이동하는 편의성을 구현하곤 했다.
검색하고 코드를 적용했기에 제대로 이해는 못했지만 구현되는 모습만 봤을 때 참 뿌듯했던 기억이 난다.

이번 개인 프로젝트를 할 때도 적용을 해보았는데, 과연 내가 얼마나 알고 있는지 생각하게 됐다. 그러면서 자세히 모르고 있겠다~ 싶은 마음에 조금씩 공부한 내용을 적어본다!


What is Notification Center

공식문서을 간략하게 보면 'notification dispatch mechanism'이라 설명을 한다.
개인적으로 이해했을 때는 어떤 행동/행위에 의해 순차적으로 실행되는 코드 혹은 조건에 따라 실행되는 형태의 무언가로 이해하게 된다. 특히, 옵저버로 등록된 객체에게 정보를 전달하는 용도로 활용이 되는데, 여기에 해당하는 정보는 상태의 변화를 볼 수 있겠다! (키보드가 특정 화면을 가리고 있는가!)

좀 더 쉽게 이해한다면 사용자 행동을 지켜보고 있다가 특정 조건을 발동하면 지정된 정보를 Notification Center에 저장, 지정한 '감시자' 객체로 정보를 보내는 형식이다. 따라서 특정 이벤트에 따라 행동이 되어야 하는 상황에 Notification Center를 종종 사용한다고 한다. (개인적으로는 키보드 이동 이외에는 없었지만..!)


주 목적 = 정보 전달?

위에서도 작성했듯, Notification Center을 사용하는 이유는 특정 프로퍼티 혹은 메서드의 실행 여부를 감시하기 위함. 사용자가 어플에서 해당 메서드 혹은 프로퍼티가 변동되는 동작을 실행했는지인 셈이다.

이 때문에 변한 값에 대한 안내 혹은 정보 전달을 delegate 패턴을 활용해서 전달하는 경우도 있겠지만, 생각보다 최고의 선택이 아닌 경우도 있다고 한다. 반대로 Observer Pattern에 해당하는 Notification Center는 여러 가지 장점이 존재한다고 하는데, 아래와 같다고 한다!

  1. 하나 또는 여러 클래스간의 감시 및 정보 전달을 담당 및 관리
  2. 하나 또는 여러 클래스에서 신호, 정보 전달 가능
  3. 여러 클래스로부터 감시에 의한 신호 수신 가능
  4. 1 대 1 그리고 다수 - 다수 연결 고리를 맺어준다.

즉, 말 그대로 프로젝트 내부에 있는 하나의 '센터'에서 다양한 파일에서 보내지는 신호에 대한 알림을 받는다는 점과 처리를 할 수 있다는 점이겠다. 또 다른 특징이라면, 한번에 여러 이벤트에 대한 기록이 가능하다는 점

여러모로 활용할 수 있는 방법이 좀 있을 듯하다!


How code is used

NotificationCenter는 활용하는 여러 방식이 있는 것으로 알고 있지만 우선 addObserver를 사용한 방식을 정리한다!

NotificationCenter.default.addObserver(self,
selector: #selector(keyboardAppeared),
name: UIResponder.keyboardWillShowNotification, object: nil)

먼저 Notification Center를 통해 특정 객체에게 '감시자' 역할을 주도록 등록한다.
해당 객체가 앞으로 notification에 대한 응답을 하게 된다.
위에서 지정한 'self'는 현재 viewController라고 볼 수 있다!

이후, selector에서 특정 메서드가 실행되도록 지정을 해두고 NSNotification.Name 타입의 값에 대한 정보를 받는다면 해당 selector가 실행되는 구조이다.

위 코드를 예시로 들자면 keyboardAppeared 메서드는 keyboardWillShowNotification가 호출되는 동시에 실행된다. (동시에 실행되는 이유는 keyboardWillShowNotification은 키보드가 호출되기 직전에 전달되는 정보이기 때문. 따라서 키보드가 등장하는 동시에 keyboardAppeared 메서드가 호출되는 것)

참고

post-custom-banner

0개의 댓글