https://github.com/iamchiwon/RxSwift_In_4_Hours
MVVM(Model-View-ViewModel) 패턴은 사용자 인터페이스의 구성 요소를 세 가지 주요 역할로 나누어 관리하는 패턴입니다:
MVVM은 코드의 재사용성을 높이고, UI 로직과 비즈니스 로직을 분리하여 유지보수를 용이하게 만듭니다.
RxSwift는 반응형 프로그래밍을 위한 Swift 라이브러리로, 비동기 이벤트 흐름을 처리하는 데 유용합니다. RxSwift를 사용하면 데이터 흐름과 상태 변화를 선언적 방식으로 처리할 수 있습니다. RxSwift는 주로 옵저버블(Observable)과 옵저버(Observer) 패턴을 사용하여 데이터의 변화를 자동으로 UI에 반영하는데 사용됩니다.
MVVM과 RxSwift를 결합하면 ViewModel에서 데이터를 관리하고, RxSwift의 Observable을 통해 View에서 데이터를 바인딩할 수 있습니다. 이를 통해 UI와 데이터의 변경 사항을 자동으로 연결할 수 있습니다.
struct User {
let name: String
let age: Int
}
import RxSwift
import RxCocoa
class UserViewModel {
private let disposeBag = DisposeBag()
// 입력
var userName: BehaviorRelay<String> = BehaviorRelay(value: "")
var userAge: BehaviorRelay<Int> = BehaviorRelay(value: 0)
// 출력
var userDetails: Observable<String> {
return Observable.combineLatest(userName, userAge) { name, age in
return "Name: \(name), Age: \(age)"
}
}
func updateUserInfo(name: String, age: Int) {
userName.accept(name)
userAge.accept(age)
}
}
import UIKit
import RxSwift
import RxCocoa
class UserViewController: UIViewController {
private let disposeBag = DisposeBag()
private let viewModel = UserViewModel()
private let nameLabel = UILabel()
private let ageLabel = UILabel()
private let nameTextField = UITextField()
private let ageTextField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
bindViewModel()
}
private func setupUI() {
// UI 요소 설정
view.addSubview(nameLabel)
view.addSubview(ageLabel)
view.addSubview(nameTextField)
view.addSubview(ageTextField)
// 레이아웃 설정 (간단하게 스택뷰 등을 사용해도 좋음)
}
private func bindViewModel() {
// 텍스트 필드를 ViewModel의 입력에 바인딩
nameTextField.rx.text.orEmpty
.bind(to: viewModel.userName)
.disposed(by: disposeBag)
ageTextField.rx.text.orEmpty
.map { Int($0) ?? 0 }
.bind(to: viewModel.userAge)
.disposed(by: disposeBag)
// ViewModel의 출력(userDetails)을 라벨에 바인딩
viewModel.userDetails
.bind(to: nameLabel.rx.text)
.disposed(by: disposeBag)
// 예시로 userName을 업데이트하는 버튼 액션 (이벤트 발생)
let updateButton = UIButton(type: .system)
updateButton.rx.tap
.subscribe(onNext: { [weak self] in
self?.viewModel.updateUserInfo(name: "John Doe", age: 25)
})
.disposed(by: disposeBag)
}
}
BehaviorRelay를 사용하여 userName과 userAge를 관리하고, userDetails는 이 데이터를 결합하여 최종적으로 UI에 표시할 문자열을 반환합니다.UILabel, UITextField)를 사용하며, RxSwift를 통해 ViewModel의 데이터를 바인딩합니다. 또한, 사용자 입력을 받아 ViewModel에 전달합니다.MVVM과 RxSwift를 결합하여 iOS 애플리케이션을 개발하면 코드의 가독성 및 재사용성을 크게 향상시킬 수 있습니다. ViewModel을 통해 UI와 비즈니스 로직을 분리하고, RxSwift를 활용하여 반응형 프로그래밍 패러다임을 채택하면 UI의 변경 사항을 더 쉽게 처리할 수 있습니다.