Search

delegate의 역할과 중요성

delegate는 다른 클래스에 특정 이벤트가 발생했을 때 알리기 위해 사용된다. 예를 들어, LoginController와 RegistrationController 클래스에서 사용자 인증 관련 이벤트를 처리한 후, 이를 앱의 다른 부분에 알리는 데 delegate가 사용된다.
protocol AuthenticationDelegate: AnyObject { func authenticationDidComplete() } ... weak var delegate: AuthenticationDelegate?
Swift
복사
weak 키워드는 객체를 참조할 때 참조 카운트를 증가시키지 않아 강한 순환 참조를 방지하는 데 유용하다. 강한 순환 참조란 두 객체가 서로를 강하게 참조하면서 서로가 메모리에서 해제되지 못하는 문제를 발생시키는 것이다. 따라서 weak로 선언된 delegate는 더 이상 필요하지 않을 때 자동으로 nil이 되어 메모리 누수를 방지할 수 있는 것이다.
1.
신규 회원 등록 화면 전환
@objc func handleShowSignUp() { let controller = RegistrationController() controller.delegate = delegate navigationController?.pushViewController(controller, animated: true) }
Swift
복사
회원가입 버튼을 눌러 RegistrationController로 이동할 때 두 컨트롤러는 같은 delegate 객체를 사용하게 되어 회원가입 완료와 로그인 성공와 같은 인증 관련 이벤트를 같은 delegate를 통해 관리할 수 있게 된다. 예를 들어, 어느 한 컨트롤러에서 사용자 인증이 완료되면 설정된 delegate를 통해 앱의 다른 부분에게 이를 알리고 필요한 조치를 취할 수 있다. 이렇게 delegate가 공유되면 코드의 중복을 줄이고 유연성을 제공하며 각 컨트롤러의 관리를 더욱 효율적으로 할 수 있다.
2.
인증 완료 알림
@objc func handleLogin() { guard let email = emailTextField.text else { return } guard let password = passwordTextField.text else { return } AuthService.logUserIn(withEmail: email, password: password) { result, error in if let error = error { print("DEBUG: Failed to register user \(error.localizedDescription)") return } self.delegate?.authenticationDidComplete() } }
Swift
복사
위 메서드에서 사용자가 성공적으로 로그인을 마친 경우, authenticationDidComplete 메서드를 호출한다. 이는 delegate를 통해 다른 컨트롤러에게 인증이 완료되었다는 것을 알린다. 예를 들어, 다음 코드와 같이 메서드를 통해 사용자를 앱의 메인 화면으로 이동시키는 등의 동작을 할 수 있다.
// MainTabBarController.swift extension MainTabBarController: AuthenticationDelegate { func authenticationDidComplete() { fetchUser() dismiss(animated: true) } }
Swift
복사
로그인이나 회원가입 등의 인증 과정이 성공적으로 마무리되면 authenticationDidComplete 메서드가 호출된다.
이 메서드 내에서 첫 번째로 실행되는 것은 fetchUser 함수를 호출하는 것이다. 이 함수는 서버나 데이터베이스로부터 최신의 사용자 데이터를 불러오는 역할을 수행한다.
func fetchUser() { UserService.fetchUser { user in self.user = user } }
Swift
복사
사용자 정보를 갱신한 후, dismiss를 통해 현재 표시된 로그인 창을 닫고 메인 인터페이스로 돌아간다.