MVVM(Model-View-ViewModel)은 iOS 앱 개발에서 자주 사용하는 아키텍처 패턴 중 하나다. 각각의 역할을 명확히 나누어 코드 재사용성과 유지보수를 높이는 것이 목적이다 !
Model
View
UIViewController
, 화면에 표시되는 버튼, 라벨 등이 여기에 해당.ViewModel
RxSwift는 비동기 데이터 흐름과 이벤트 처리를 간단하게 할 수 있게 도와주는 라이브러리. Reactive Programming(리액티브 프로그래밍)을 iOS에 적용할 때 사용된다.
Observable (관찰 가능한 객체)
Observer (관찰자)
Binding
observable.map { $0 * 2 }
observable.filter { $0 > 10 }
Observable.combineLatest(observable1, observable2)
struct User {
var name: String
}
import RxSwift
import RxCocoa
class UserViewModel {
// 텍스트 필드 입력 값을 Observable로 노출
let name = BehaviorRelay<String>(value: "")
}
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
private let textField = UITextField()
private let label = UILabel()
private let disposeBag = DisposeBag()
private let viewModel = UserViewModel()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
setupBindings()
}
private func setupUI() {
view.backgroundColor = .white
textField.borderStyle = .roundedRect
textField.placeholder = "Enter name"
label.textAlignment = .center
label.textColor = .black
let stackView = UIStackView(arrangedSubviews: [textField, label])
stackView.axis = .vertical
stackView.spacing = 16
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16)
])
}
private func setupBindings() {
// View -> ViewModel 바인딩
textField.rx.text.orEmpty
.bind(to: viewModel.name)
.disposed(by: disposeBag)
// ViewModel -> View 바인딩
viewModel.name
.bind(to: label.rx.text)
.disposed(by: disposeBag)
}
}
오.. 저 이번에 .map 썼어요
버튼 탭 이벤트 추적할 때 .rx.tap 썼는데 얘는 기본적으로 Observable를 방출한다고 해요.
그래서 필요한 값을 방출하도록 바꿔줄때 .map을 써야 되더라구욤