본문 바로가기

개발

RxSwift로 로그인 로직 만들기

728x90

RxSwift를 사용한 간단한 로그인 로직 구현

RxSwift를 사용하여 간단한 로그인 시스템을 구현하는 방법은 다음과 같습니다.

1. UI 요소와 ViewModel 설정

  • ViewController에서 로그인 폼을 위한 UI 요소 (이메일, 비밀번호 입력 필드, 로그인 버튼)를 설정합니다.
  • ViewModel클래스를 만들고 로그인 로직을 담당할 속성과 메서드를 정의합니다.
import UIKit

import RxSwift



class LoginViewController: UIViewController {



    @IBOutlet weak var emailTextField: UITextField!

    @IBOutlet weak var passwordTextField: UITextField!

    @IBOutlet weak var loginButton: UIButton!



    private let viewModel = LoginViewModel()

    private let disposeBag = DisposeBag()



    override func viewDidLoad() {

        super.viewDidLoad()



        setupBindings()

    }



    private func setupBindings() {

        emailTextField.rx.text

            .bind(to: viewModel.emailText)

            .disposed(by: disposeBag)



        passwordTextField.rx.text

            .bind(to: viewModel.passwordText)

            .disposed(by: disposeBag)



        loginButton.rx.tap

            .bind(to: viewModel.loginTap)

            .disposed(by: disposeBag)



        viewModel.isLoggingIn

            .bind(to: loginButton.rx.isEnabled)

            .disposed(by: disposeBag)



        viewModel.loginResult

            .subscribe(onNext: { [weak self] result in

                self?.handleLoginResult(result)

            })

            .disposed(by: disposeBag)

    }



    private func handleLoginResult(_ result: LoginResult) {

        switch result {

        case .success:

            print("로그인 성공!")

            // 화면 전환 또는 다른 작업 수행

        case .failure(let error):

            print("로그인 실패: \(error.localizedDescription)")

            // 오류 메시지 표시 또는 처리

        }

    }

}



enum LoginResult {

    case success

    case failure(Error)

}



class LoginViewModel {

    let emailText = BehaviorSubject<String>(value: "")

    let passwordText = BehaviorSubject<String>(value: "")

    let loginTap = PublishSubject<Void>()

    let isLoggingIn = BehaviorSubject<Bool>(value: false)

    let loginResult = PublishSubject<LoginResult>()



    func login() {

        isLoggingIn.onNext(true)



        // 실제 로그인 API 호출 및 처리

        // 예시:

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in

            if self?.emailText.value == "user@example.com" && self?.passwordText.value == "password" {

                self?.loginResult.onNext(.success)

            } else {

                self?.loginResult.onNext(.failure(NSError(domain: "LoginError", code: 101, userInfo: nil)))

            }

            self?.isLoggingIn.onNext(false)

        }

    }

}

 

2. 로그인 로직 구현

  • ViewModel의 login 메서드에서 실제 로그인 API 호출 및 처리를 수행합니다.
  • API 호출 후 성공 여부에 따라 loginResult PublishSubject에 .success 또는 .failure 이벤트를 전달합니다.

3. UI 업데이트 및 이벤트 처리

  • ViewController에서 ViewModel의 loginResult Observable을 구독하고 로그인 결과에 따라 UI를 업데이트하거나 오류 메시지를 표시합니다.

참고:

  • 이 코드는 기본적인 예시이며 실제 구현에서는 API 호출, 에러 처리, UI 디자인 등을 추가적으로 구현해야 합니다.
  • RxSwift의 다양한 연산자와 API를 활용하여 더욱 복잡하고 효율적인 로그인 로직을 구현할 수 있습니다.

추가 기능 구현:

  • 이메일 및 비밀번호 유효성 검사
  • 로그인 시도 중 UI 비활성화
  • 자동 로그인 기능
  • 토큰 기반 인증

RxSwift를 사용하면 다음과 같은 이점이 있습니다.

  • 비동기 작업 및 이벤트 처리를 효율적으로 관리할 수 있습니다.
  • 코드를 더욱 명확하고 이해하기 쉽게 만들 수 있습니다.
  • UI 업데이트 데이터 흐름을 간편하게 처리할 수 있습니다.

'개발' 카테고리의 다른 글

RxSwift로 회원가입 로직 만들기  (0) 2024.07.09
RxSwift로 비밀번호 체크 로직 만들기  (0) 2024.07.09
RxSwift Share Operators  (0) 2024.07.09
RxSwift Combining Operators  (0) 2024.07.09
RxSwift Transforming Operators  (0) 2024.07.09