📌 Notification

User Notification과는 다르게, 유저가 아닌 다른 객체에게 '이런 이벤트가 발생했어!'하고 알려주는 싱글톤 객체다.

  • name : 전달하고자 하는 notification의 이름 (이걸 통해 알림을 식별함)
  • object : 발송자가 옵저버에게 보내려고 하는 객체
  • userInfo : notification과 관련된 부가적인 정보

Notification Center


NotificationCenter는 노티피케이션을 전달해주는 녀석이다. 어떤 상황에 노티피케이션을 받고자 하는 객체가 NotificationCenter에 옵저버를 등록하면, 추후에 다른 객체가 해당 노티피케이션을 post했을 때 NotificationCenter로부터 노티피케이션을 전달받는다.

옵저버가 많다면 NotificationCenter는 브로드캐스트 방식으로 노티피케이션을 모든 옵저버에게 전달한다.


NotificationCenter에 옵저버 등록

요런 코드가 있다고 해보자.

name 파라미터에 담긴 userDidSelectFilterNotificationName이라는 이름을 가진 노티피케이션이 오면 selector 파라미터에 담긴 didRecieveUserDidSelectFilterNotification(_:) 메서드를 통해 나한테 전달해줘!

라고 옵저버를 등록한 것이다. object가 nil인 것은, 어떤 오브젝트가 보낸 노티피케이션인지 상관 안 하고 다 받겠다는 뜻이다.


NotificationCenter로 노티피케이션 발송

그러면 이렇게 다른 곳에서

name 파라미터에 담긴 userDidSelectFilterNotificationName이라는 이름을 가진 노티피케이션을 userInfo 파라미터에 부가적인 정보를 담아서 보낼게! 어떤 오브젝트가 보낸 건지는 알려주지 않을 거니까 object 파라미터엔 nil을 쓸게.

라고 노티피케이션을 보내면


옵저버의 selector에 등록해뒀던 메서드에서 노티피케이션을 받아서 무슨 일이 일어났는지 userInfo를 통해 확인하고 그 이벤트에 대한 처리를 진행하게 된다.


이렇게 NotificationCenter를 활용하면 다른 인스턴스를 직접적으로 참조하지 않아도 서로 무슨 일이 발생했는지 알려줄 수 있다는 장점이 있으나, 누가 이 노티피케이션을 받게 될지 모르며 코드가 분산된다는 단점도 존재하니 적재적소에 잘 활용하도록 하자!

그리고, 이렇게 노티피케이션을 직접 만들어서 보낼 수도 있지만 시스템 자체에서 특정 상황에 노티피케이션을 발송하는 경우도 많다. 키보드가 화면에 나타나고 사라지고, 기기의 가로/세로가 변경되는 등의 상황을 노티피케이션을 통해 알려주니 옵저버 등록만 해두면 손쉽게 대응할 수 있는 다양한 경우들이 있다.


📌 Operation Queue

비동기 프로그래밍을 위한 클래스로, DispatchQueue의 사용을 조금 더 용이하게 하기 위한 클래스이다. DispatchQueue와 비교했을 때 좀 더 객체지향적이고 Object-C와도 더 친숙하다.

DispatchQueue에서는 작업을 task라고 했었는데, OperationQueue에서는 작업을 operation이라고 한다. 마찬가지로 OperationQueue에서도 main 프로퍼티를 통해 메인스레드를 부를 수 있다.

addOperation 메서드로 동시에 실행가능한 작업의 수를 제한할 수도 있고, cancelAllOperations 메서드로 큐에 대기중인 작업을 취소할 수도 있다.


이런 코드가 있다고 하자. asset을 fetch해오는 작업을 수행하는 코드인데, asset이 너~무 많아서 시간이 오래 걸릴 것 같아 백그라운드 스레드에서 처리할 수 있도록 OperationQueue를 생성해서 addOperation으로 작업을 등록해주었다. 이런 식으로 사용하는 것!

작업을 처리하려고 가서 보니 fetchResult 프로퍼티가 UI 변경 작업을 수행하는 코드가 있어, 메인스레드에서 처리할 수 있도록 OperationQueue의 main 프로퍼티로 메인스레드를 가져와주었다.


📌 Container View

View Controller 안에 다른 View Controller의 뷰를 사용하기 위해 사용한다.

으아악

profile
기록하는 개발자 👀

0개의 댓글

Powered by GraphCDN, the GraphQL CDN