여기서 Delegate란 대리자 란 뜻으로
zedd님의 말을 빌리면 객체지향 프로그래밍에서 하나의 객체가 모든일을 처리하는 것이 아니라 처리해야할 일들 중 일부분을 다른 객체에 넘긴다는 것이에여
저는 로그인 기능을 구현하기로 해서 LoginDelegate란 프로토콜을 만들었어요
protocol LoginDelegate: class {
func loginSuccess()
func loginFailed(err: String)
}
LoginDelegate는 성공했을 경우와 실패했을 경우로 나누고
class LoginViewModel: NSObject {
weak var delegate: LoginDelegate?
로그인처리를 하는 ViewModel에서 delegate를 선언해줍니다.
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
if let error = error {
delegate?.loginFailed(err: error.localizedDescription)
}
// 사용자 정보 가져오기
if let userId = user.userID {
delegate?.loginSuccess()
} else {
print("Error : User Data Not Found")
}
}
로그인에 실패했을 경우 delegate의 fail메소드를
성공시엔 success메소드를 호출하여 사용하면 되용
let loginVM = LoginViewModel()
loginVM.delegate = self
extension MainViewController: LoginDelegate {
func loginSuccess() {
self.mainViewPresenter()
}
func loginFailed(err: String) {
print(err)
}
}
그리고 loginViewModel의 delegate( 대리자 )는 MainViewController가 하도록 loginVM.delegate = self로 구현해주시면 되고
해당 ViewModel을 사용하는
Controller에 Login Protocol을 채택하여
해당 프로토콜 메소드의 상황에 맞는 행동을 하시면 잘 동작합니다!
출처
https://baked-corn.tistory.com/23
https://zeddios.tistory.com/8