안녕하세요 :)
이번 포스팅에선 NotificationCenter에 대해 알아보겠습니다.
NotificationCenter란?
쉽게 말하면! NotificationCenter에 어떤 이벤트가 발생했을때 어떤 일이 처리될 지를 정의해 등록하고 관리하는 거예요.
iOS 앱개발을 하다보면 어떤 이벤트가 발생했을 때 바로 처리해주고 싶은 일이 있는데 그게 어려울 때가 있죠?
그럴 때 NotificationCenter를 쓰면 뷰간 관계에 상관없이 쉽게 이벤트를 처리해줄 수 있답니다.
애플 공식문서엔 요로케 나와 있네요?
제가 이번에 진행한 날씨 앱 프로젝트를 예시로 들어 설명을 드릴게요.
저는 현재 선택된 날짜가 변할때마다 일을 처리해줘야하는 상황이라서 NotificationCenter를 이용했습니다.
NotificationCenter 처리 과정
이렇게 현재 선택된 날짜가 바뀌면 밑에 그 날짜에 대한 정보가 바뀌어야하는데, 둘이 다른 ViewController여서 데이터 전달이 복잡했다고 가정하고 해볼게요!
그럼 이런 플로우가 생깁니다.
선택된 날짜가 바뀌었다 --> 이벤트가 발생했다.
이벤트가 발생했기 때문에 그에 따른 정의된 일을 처리한다 --> 날짜에 대한 세부 정보가 뜬다.
이렇게 하기 위해선 우선 NotificationCenter에
post라는 과정을 거쳐줘야해요.
주간 달력부분 ViewController파일(CalendarVC.swift)에서 NotificationCenter에 post를 해주는 코드입니다. 이건 selectedDate가 바뀔 때 호출되도록 작성해줬어요.
ChangeDate라는 Notification 객체를 만들고, selectedData라는 데이터를 붙여서 NotificationCenter에 쏴주겠다는 뜻이에요.
그럼 NotificationCenter가 이걸 받아서 다른 observer에게 바로 전달해줄 수 있어요.
이제 observer등록을 어떻게 하는지 볼게요!
저는 달력에서 바뀐 날짜를 받아서 상세 ViewController 내용을 바꾸고 싶은거니까, 이 코드는 상세 뷰컨 파일(CalendarDetailVC.swift)에서 해줘야겠죠? 저는 이 코드를 viewDidLoad에 작성해주었어요!
name을 보면 아까와 같이 "ChangeDate"라는 이름이 들어가있죠? 그럼 아까 만든 ChangeDate라는 객체에 대해 일을 처리하는 observer를 등록하겠단 겁니당.
그래서 이렇게 observer를 등록해주면 NotificationCenter가 아까 포스트를 받고 바로 observer에게 이벤트가 발생했음을 알려주는거예요! 이 observer는 이벤트가 발생했음을 전달받으면 selector안에 있는 objc 함수를 실행하게 됩니다. 이때 처리되길 바라는 함수를 작성해주시면 돼요!
저는 이런식으로 작성해줬어요.
notification을 인자로 받으면 그 안에 object에 접근해서 아까 post할 때 object에 넣어줬던 selectedDate에 접근할 수 있습니다!!
이해가 되시나요??
먼저 이벤트가 발생하는 곳에서 post를 하고,
이벤트 처리하는 곳에서 addObserver를 통해 원하는 함수가 실행되도록 한다!
NotificationCenter는 뷰간 데이터 전달하는데 제약이 줄어들지만 메모리상으로 부담이 있다고 하니 참고하셔서 사용하면 좋을 것 같아요.
질문이나 잘못된 정보가 있다면 댓글로 알려주세요 :)
감사합니다!
'iOS' 카테고리의 다른 글
[iOS] UIPanGestureRecognizer 알아보기 (드로어 구조 만들기) (2) | 2021.03.07 |
---|---|
[iOS] 아이폰에서 URL, 이메일 열기 (0) | 2021.02.28 |
[iOS] Date 구조체를 이용해 캘린더 만들기 - 1 (extension 이용하기) (0) | 2021.02.14 |