iOS/Swift 상식

Delegates vs Notification 동작 방식

HJ39 2023. 2. 18. 01:21

두 동작 방식 모두 앱 내에서 발생한 이벤트가 현재 화면이 아닌 다른 화면까지 영향을 줄 때 사용한다.

 

공통점

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 동작 방식을 표로 정리되어 있는 것을 발견했다

 

# 참고한 사이트

  1. https://neph3779.github.io/ios/DelegateVsNotification/
  2. https://you9010.tistory.com/275
  3. https://leeari95.tistory.com/49
  4. https://hj39-develop.tistory.com/135

'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