User Notification과는 다르게, 유저가 아닌 다른 객체에게 '이런 이벤트가 발생했어!'하고 알려주는 싱글톤 객체다.
NotificationCenter는 노티피케이션을 전달해주는 녀석이다. 어떤 상황에 노티피케이션을 받고자 하는 객체가 NotificationCenter에 옵저버를 등록하면, 추후에 다른 객체가 해당 노티피케이션을 post했을 때 NotificationCenter로부터 노티피케이션을 전달받는다.
옵저버가 많다면 NotificationCenter는 브로드캐스트 방식으로 노티피케이션을 모든 옵저버에게 전달한다.
요런 코드가 있다고 해보자.
name
파라미터에 담긴 userDidSelectFilterNotificationName이라는 이름을 가진 노티피케이션이 오면selector
파라미터에 담긴 didRecieveUserDidSelectFilterNotification(_:) 메서드를 통해 나한테 전달해줘!
라고 옵저버를 등록한 것이다. object
가 nil인 것은, 어떤 오브젝트가 보낸 노티피케이션인지 상관 안 하고 다 받겠다는 뜻이다.
그러면 이렇게 다른 곳에서
name
파라미터에 담긴 userDidSelectFilterNotificationName이라는 이름을 가진 노티피케이션을userInfo
파라미터에 부가적인 정보를 담아서 보낼게! 어떤 오브젝트가 보낸 건지는 알려주지 않을 거니까object
파라미터엔 nil을 쓸게.
라고 노티피케이션을 보내면
옵저버의
selector
에 등록해뒀던 메서드에서 노티피케이션을 받아서 무슨 일이 일어났는지 userInfo
를 통해 확인하고 그 이벤트에 대한 처리를 진행하게 된다.
이렇게 NotificationCenter를 활용하면 다른 인스턴스를 직접적으로 참조하지 않아도 서로 무슨 일이 발생했는지 알려줄 수 있다는 장점이 있으나, 누가 이 노티피케이션을 받게 될지 모르며 코드가 분산된다는 단점도 존재하니 적재적소에 잘 활용하도록 하자!
그리고, 이렇게 노티피케이션을 직접 만들어서 보낼 수도 있지만 시스템 자체에서 특정 상황에 노티피케이션을 발송하는 경우도 많다. 키보드가 화면에 나타나고 사라지고, 기기의 가로/세로가 변경되는 등의 상황을 노티피케이션을 통해 알려주니 옵저버 등록만 해두면 손쉽게 대응할 수 있는 다양한 경우들이 있다.
비동기 프로그래밍을 위한 클래스로, DispatchQueue의 사용을 조금 더 용이하게 하기 위한 클래스이다. DispatchQueue와 비교했을 때 좀 더 객체지향적이고 Object-C와도 더 친숙하다.
DispatchQueue에서는 작업을 task
라고 했었는데, OperationQueue에서는 작업을 operation
이라고 한다. 마찬가지로 OperationQueue에서도 main
프로퍼티를 통해 메인스레드를 부를 수 있다.
addOperation
메서드로 동시에 실행가능한 작업의 수를 제한할 수도 있고, cancelAllOperations
메서드로 큐에 대기중인 작업을 취소할 수도 있다.
이런 코드가 있다고 하자. asset을 fetch해오는 작업을 수행하는 코드인데, asset이 너~무 많아서 시간이 오래 걸릴 것 같아 백그라운드 스레드에서 처리할 수 있도록 OperationQueue를 생성해서
addOperation
으로 작업을 등록해주었다. 이런 식으로 사용하는 것!
작업을 처리하려고 가서 보니 fetchResult 프로퍼티가 UI 변경 작업을 수행하는 코드가 있어, 메인스레드에서 처리할 수 있도록 OperationQueue의
main
프로퍼티로 메인스레드를 가져와주었다.
View Controller 안에 다른 View Controller의 뷰를 사용하기 위해 사용한다.
으아악