ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS [Swift] - Delegate로 State Observing하기
    iOS Develop 2022. 12. 2. 17:27
    반응형

    이번 포스팅은 Delegate Patter으로 State를 주시하다가 Update 해주는 방법을 알아보도록 하겠습니돠!

     

    우리가 ViewModel에 작업을 지시해놓고 작업이 다 처리가 되면, View라던지 Data를 업데이트 해줘야하는 경우가 있는데요!

    그럴 때 사용할 수 있는 방법 중 하나로 Delegate 패턴을 사용해보겠습니다. 

     

    대략 정리를 해보자면,

     

    ViewController 

        - Protocol 채택 (각 상태 별 case 구현)

        - viewModel 변수 생성 및 호출

        - viewModel delegate 위임자 설정

        - state에 따른 update 처리

     

    ViewModel

        - Protocol 정의 [ didUpdateState() ]

        - enum 정의 (상태 값으로 사용될 case 정의)

        - state 변수 생성 (didSet으로 상태 변경 감지)

     

    ViewController에 delegate를 위임한 상태에서, ViewModel은 상태 변경을 감지하고 ViewModel 메소드에서 상태 값을 변경하면 ViewController에서 delegate로 받아 업데이트를 시켜주는 구조입니다.

     

    // LoginViewModel
    
    protocol LoginDelegate {
      func didUpdateState(to state: LoginState)
    }
    
    enum LoginState {
      case loginSucceed
      case loginFailure
      case wait
    }
    
    class LoginViewModel {
      var state: LoginState = .wait {
        didSet {
          self.delegate?.didUpdateState(to: self.state)
        }
      }
      
      var delegate: LoginDelegate? = nil
      
      // State 값을 변경 시켜줄 함수 code
      ...
      
    }
    // LoginViewController
    
    class LoginViewController: UIViewController, LoginDelegate {
      func didUpdateState(to state: LoginState) {
        switch state {
        case .loginSucceed:
          // 상태에 따른 뷰 업데이트 및 다른 처리
          loginSucceed()
        case .loginFailure:
          loginFailure()
        case .wait:
          wait()
        }
      }
      
      var viewModel: LoginViewModel?
      
      override func viewDidLoad() {
        super.viewDidLoad()
        
        viewModel = LoginViewModel()
        viewModel?.delegate = self
        
      } 
      
      // View update 또는 Data 수정 code 
      ...
      
    }

    이렇게 간단하게나마 상태를 옵저빙하고 감지한 순간 update를 처리해주는 과정을 살펴보았습니다. 크게 구조를 파악해두면 여기 저기 휘뚜루 마뚜루 이용하기 넘 좋은 것 같습니당!! 

     

    감사합니다!! :-) 안농~

    'iOS Develop' 카테고리의 다른 글

    오픈 소스 공유 - Sliding Tab Bar  (0) 2022.12.26
    iOS [Swift] - Coordinator Pattern (1)  (0) 2022.12.19
    iOS [Swift] - Promises  (0) 2022.12.02
    iOS [SwiftUI] - @EnvironmentObject 사용하기  (0) 2022.09.28
    iOS [Swift] - App Version 정리  (0) 2022.07.28
Designed by Tistory.