안녕하세요, 오늘은 'Delegate 패턴'이라는 널리 알려진 개념이지만, 이번 포스트에서는 'Delegate를 활용한 상태 변화 알리기'에 초점을 맞춰 소개하려고 합니다. Delegate 패턴은 설계 패턴 중 하나로, 다양한 상황과 문제 해결에 적용될 수 있습니다. 그 중에서도 오늘은 iOS의 View Controller 간에 상태 변화를 알리는 방법에 초점을 맞춰서 이야기하려고 합니다.
Delegate 패턴이란?
Delegate 패턴이란, 특정 객체가 자신의 일부 작업을 다른 객체에게 위임하는 설계 패턴입니다. 이 패턴을 사용하면 두 객체 간의 상호작용을 쉽게 구현할 수 있습니다. Swift에서는 delegate를 위해 protocol을 주로 사용합니다.
Delegate 패턴의 사용 예시
예를 들어, 우리가 개발하고 있는 앱에 '설정' 화면(SettingsViewController
)이 있고, 이 화면에서 사용자가 어떤 설정을 변경하면 메인 화면(MainViewController
)에 그 변경 사항을 반영하도록 하고 싶다고 해봅시다. 이때 Delegate 패턴을 사용하면 SettingsViewController
와 MainViewController
가 직접적으로 연결되지 않아도 서로 정보를 주고받을 수 있어, 코드의 결합도를 낮추고 유지 보수성을 높일 수 있습니다.
Delegate 패턴의 구현
이를 구현하기 위해 우리는 먼저 'SettingsViewControllerDelegate'라는 프로토콜을 정의합니다. 이 프로토콜에는 'didChangeDB()'라는 메서드를 선언합니다.
protocol SettingsViewControllerDelegate: AnyObject {
func didChangeDB()
}
'AnyObject'를 프로토콜 선언에 추가하는 이유는 delegate가 클래스 인스턴스만 가능하게 하기 위함입니다. 이를 통해 강한 참조 주기 문제(Strong Reference Cycle)를 피할 수 있습니다.
그 다음, SettingsViewController
에 'delegate'라는 프로퍼티를 추가하고, 이 프로퍼티를 통해 delegate에게 일을 위임할 수 있도록 합니다. 여기서 'weak' 키워드는 메모리 누수를 방지하기 위해 사용됩니다. 객체 간의 순환 참조를 막기 위해 delegate 프로퍼티는 weak로 선언되며, 이로 인해 해당 delegate가 더 이상 필요 없어지면 메모리에서 제거됩니다.
class SettingsViewController: UIViewController {
weak var delegate: SettingsViewControllerDelegate?
// ...
}
이제 사용자가 설정을 변경했을 때 이 사실을 delegate에게 알릴 수 있는 방법이 필요합니다. 그러기 위해선, 사용자 설정 변경 후 DB에 변경 사항을 저장하고, delegate에게 DB가 변경되었음을 알리는 메서드를 추가합니다.
class SettingsViewController: UIViewController {
weak var delegate: SettingsViewControllerDelegate?
func userChangedSetting() {
// 사용자 설정 변경 작업...
// DB 저장 작업...
saveChangesToDB()
// DB 변경 후에는 delegate를 통해 이 사실을 알립니다.
delegate?.didChangeDB()
}
func saveChangesToDB() {
// 설정 변경을 DB에 저장하는 코드...
}
}
마지막으로 MainViewController
에서는 'SettingsViewControllerDelegate' 프로토콜을 준수하도록 하고, 'didChangeDB()' 메서드를 구현합니다. 'didChangeDB()' 메서드는 DB가 변경되었을 때 수행할 동작을 코딩하는 곳입니다.
class MainViewController: UIViewController, SettingsViewControllerDelegate {
//...
func didChangeDB() {
// DB 변경 시 수행할 동작을 여기에 코딩합니다.
}
}
결론
Delegate 패턴을 통해 SettingsViewController
에서 DB 변경 이벤트가 발생할 때마다 MainViewController
의 'didChangeDB()' 메서드가 호출되며, 그로 인해 DB 변경 사항을 반영한 동작이 수행됩니다. 이런 방식으로 두 객체 간의 결합도를 낮추면서도 필요한 정보를 효과적으로 주고받을 수 있습니다.
'Swift' 카테고리의 다른 글
[Swift] 메모리 관리: 순환 참조 (0) | 2023.07.19 |
---|---|
[Swift]메모리 관리: ARC(Automatic Reference Counting) 이해하기 (0) | 2023.07.17 |
[Swift] UIKit 로 사이드 메뉴 구현하기 (0) | 2023.07.11 |
[Swift] Xcode Archive, Cocoapods 버전 문제로 인한 에러 (0) | 2023.07.10 |
[Swift] 버전에 따른 API 사용 가능성 체크하기(#available) (0) | 2023.07.07 |