두 동작 방식 모두 앱 내에서 발생한 이벤트가 현재 화면이 아닌 다른 화면까지 영향을 줄 때 사용한다.
공통점
Delegate, Notification 둘 다 한 화면에서 발생한 이벤트를 다른 화면에 전달하는 기능을 가지고, 값의 변화를 감지해서 이벤트를 발생시킨다.
동작 방식에는 약간의 차이가 있다.
Delegates
다른 객체의 인스턴스를 내부적으로 보유하여 그 인스턴스를 활용하는 방식으로 동작한다.
Notification
어떤 객체를 Observing 한 뒤 해당 객체의 변화를 Observer들이 이벤트를 받아서 처리하는 방식으로 동작한다.
차이점
Delegates
수신하는 화면에서 발신받는 화면의 정보를 알고 있어야 한다.
Delegate에 대해 조금 더 자세히 알고 싶다면
https://hj39-develop.tistory.com/130
읽어보면 된다 ㅎ..
Notification
어떤 값의 변화를 포착한 후 그에 맞는 이벤트를 발생시킨다.
Notification의 경우 Notification Center라는 싱글턴 객체를 통해서 이벤트 발생 여부를 등록한 객체에게 post 하는 방식이다.
다수의 객체들에게 이벤트를 동시에 알려줄 수 있다.
다음 예제들은 참고한 사이트 링크 3번째 예제를 참고하였다.
이벤트가 발생하는 클래스 내부
NotificationCenter.default.post(name: Notification.Name.secret, object: nil,userInfo: [NotificationKey.password: "abcde",NotificationKey.id: "1234"])
실행하고 싶은 클래스에서 post를 이용해 실행한다.
post 매개변수
name | - 전달하고자 하는 Notification 이름 |
object | - 특정 sender의 Notification만 받고 싶은 경우 작성 - addObserver 메서드의 object 부분과 목적이 동일 - filter 기능과 유사 |
userInfo | - Notification으로 전달할 데이터 - 배열도 가능하다. |
이벤트를 받는 클래스
NotificationCenter.default.addObserver(self, selector: #selector(answerToMaster(notification:)), name: Notification.Name.secret, object: nil)
addObserver 메서드를 통해 이벤트 신호를 감지한다.
addObserver 매개변수
observer | - observer를 등록하는 부분 - 예제에서는 Friend 클래스 자기 자신을 등록함 |
selector | - addObserver를 한후 실행할 메서드 등록 - @objc 컴파일러를 사용해야 한다. |
name | - Notification 데이터가 저장되어 Notification 이름 |
object | - post 매개변수 object와 동일 |
전체 코드
import UIKit
extension Notification.Name{
static let secret = Notification.Name("")
}
enum NotificationKey{
case password
case id
}
class Master{
func callPassword(){
print("master: read password. ")
NotificationCenter.default.post(name: Notification.Name.secret, object: nil,userInfo: [NotificationKey.password: "abcde",NotificationKey.id: "1234"])
}
}
class Friend{
let name: String
init(name: String){
self.name = name
NotificationCenter.default.addObserver(self, selector: #selector(answerToMaster(notification:)), name: Notification.Name.secret, object: nil)
}
@objc func answerToMaster(notification: Notification){
guard let objectPw = notification.userInfo?[NotificationKey.password] as? String else {return}
guard let objectId = notification.userInfo?[NotificationKey.id] as? String else {return}
print("\(name)'s password: \(objectPw) , id: \(objectId)")
}
}
let master = Master()
let a = Friend(name: "jj")
let b = Friend(name: "hh")
master.callPassword()
/* 출력
master: read password.
jj's password: abcde , id: 1234
hh's password: abcde , id: 1234
*/
인터넷을 찾다 보니 KVO, Delegate, Notification 동작 방식을 표로 정리되어 있는 것을 발견했다
# 참고한 사이트
'iOS > Swift 상식' 카테고리의 다른 글
프로토콜이란? (0) | 2023.02.21 |
---|---|
멀티 스레드 구현시 고려해야할 것들 (0) | 2023.02.19 |
KVO(Key Value Observing) 동작 방식 (0) | 2023.02.11 |
Singleton 패턴 알아보기 (0) | 2023.02.05 |
Delegate 패턴 알아보기 (0) | 2023.02.04 |