이번 글에서는 객체 간 데이터의 상태 변화 혹은 정보 전달이 일어나야할 때 사용하는
Notification 과 Delegation에 대해 알아보려 합니다!
Notification
Notification은 NotificationCenter라는 싱글턴 객체 를 통해서 데이터의 상태 변화나 정보 전달이 일어나야 할 때 이를 관찰하는 객체에 알림을 보내는 시스템입니다.
Notification의 구성을 살펴보면
1) 알림 등록
NotificationCenter.default.addObserver(self,
selector: #selector(memoRecievedNotification),
name: NSNotification.Name("myNotification"),
object: nil)
2) 알림 전송 - 알림을 전송할 객체에 구현
NotificationCenter.default.post(name: Notification.Name("myNotification"),
object: nil,
userInfo: ["key": "value"])
- selector: 알림 수신 시, 실행할 메서드 구현
- name: 알림을 구분하는 식별자이고, 문자열 형식으로 제공. 같은 이름의 알림만 받음
- object: 알림과 관련된 데이터를 전달하는 개체, nil로도 설정 가능
- userInfo:추가 데이터를 전달할 수 있도록 [AnyHashable: Any] 타입으로 구성된 딕셔너리를 포함 가능, 없어도 전송 가능
Delegation
Delegate pattern은 Protocol을 정의하여 사용하는 패턴입니다.
특정 기능들을 Protocol에 정의해놓고 이벤트들을 전달하게 될 때 이를 받는 객체에 해당 기능들을 수행하도록 합니다.
객체간의 결합도를 낮춰 유지보수성과 확장성까지 높일 수 있는 패턴이죠
밑은 예시 코드입니다.
// 커피 제작 완료 알림을 위한 Delegate 프로토콜 정의
protocol CoffeeDelegate: AnyObject {
func didMakeCoffee(coffee: String)
}
// 커피를 만드는 바리스타 클래스
class Barista {
weak var delegate: CoffeeDelegate? // delegate 프로퍼티 선언 (약한 참조)
func makeCoffee() {
let coffee = "Latte"
print("Barista: 커피를 만들었어요!")
// 커피 완성 시 delegate 호출
delegate?.didMakeCoffee(coffee: coffee)
}
}
// 커피숍 클래스, 커피가 완성되면 고객에게 전달하는 역할
class CoffeeShop: CoffeeDelegate {
var barista = Barista()
init() {
barista.delegate = self // 바리스타의 delegate로 CoffeeShop 설정
}
func orderCoffee() {
print("CoffeeShop: 커피를 주문받았어요. 바리스타에게 요청합니다.")
barista.makeCoffee()
}
// 커피가 완성되면 호출되는 Delegate 메서드
func didMakeCoffee(coffee: String) {
print("CoffeeShop: \(coffee) 커피가 완성되었습니다. 고객에게 전달합니다!")
}
}
// 실행 예시
let coffeeShop = CoffeeShop()
coffeeShop.orderCoffee()
/*
CoffeeShop: 커피를 주문받았어요. 바리스타에게 요청합니다.
Barista: 커피를 만들었어요!
CoffeeShop: Latte 커피가 완성되었습니다. 고객에게 전달합니다!
*/
이뿐만 아니라 제가 프로젝트에서 많이 사용한 delegate pattern은 아마 UITableViewDelegate나 UICollectionViewDelegate를 많이 사용한 것 같습니다.
이름만 봤을 땐 거리감이 좀 있는 워딩이지만 예시를 보니 좀 감이 오는 것 같았어요!
내용은 마무리 되었구요!
제 경험을 소개해드리면서 마무리 해보자면 저는 연결된 객체간의 값 전달을 수행할 경우엔 보통 Delegate Pattern을 사용합니다.
그 이유는 이 패턴이 좀 더 코드의 추적이 쉬웠던 것 같고, Notification 처럼 싱글톤 패턴을 사용하지 않아 굳이 앱 실행 내내 인스턴스를 갖고 있지 않아도 되기 때문이었어요!
물론 여러 객체에 정보를 전달할 땐 Notification을 사용합니다!!
아무튼!!
제 생각엔 상황에 맞게 타당한 이유를 갖고 사용한다면 무엇을 사용하던 괜찮을 것 같습니다.
그럼 오늘은
여기까지~
.
.
.
.
'Swift' 카테고리의 다른 글
[iOS] About WidgetKit - 2(App Group) (0) | 2024.11.02 |
---|---|
[iOS] About TDD (1) | 2024.10.30 |
[iOS] About WidgetKit - 1 (0) | 2024.10.24 |
[iOS] About JWT(Jason Web Token) (0) | 2024.10.17 |
[iOS] About Cookie/Session (0) | 2024.10.13 |