MVVM 패턴은 Model, View, View Model로 나뉘어져 있는 아키텍처 디자인 패턴이다.
- Command Pattern: 실행될 기능을 추상화, 캡슐화하여 한 클래스에서 여러 기능을 실행할 수 있도록 하는 패턴
- Data Binding: View와 logic이 분리되어 있어도 한 쪽이 바뀌면 다른 쪽도 업데이트가 이루어지는 방식, KVO, Delegation, Functional Reactive Programming, Property Observer 방법들이 있다.
struct Person {
let firstName: String
let lastName: String
}
class GreetingViewController: UIViewController {
var viewModel: GreetingViewModelProtocol! {
didSet {
self.viewModel.greetingDidChange = { [unowned self] viewModel in
self.greetingLabel.text = viewModel.greeting
}
}
}
let showGreetingButton = UIButton()
let greetingLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.showGreetingButton.addTarget(self.viewModel, action: "showGreeting", forControlEvents: .TouchUpInside)
}
}
// Assembling of MVVM
let model = Person(firstName: "David", lastName: "Blaine")
let viewModel = GreetingViewModel(person: model)
let view = GreetingViewController()
view.viewModel = viewModel
// 프로토콜
protocol GreetingViewModelProtocol: class {
var greeting: String? { get }
var greetingDidChange: ((GreetingViewModelProtocol) -> ())? { get set }
init(person: Person)
func showGreeting()
}
// 뷰모델
class GreetingViewModel: GreetingViewModelProtocol {
let person: Person
var greeting: String? {
didSet {
self.greetingDidChange?(self)
}
}
var greetingDidChange: ((GreetingViewModelProtocol) -> ())?
required init(person: Person) {
self.person = person
}
func showGreeting() {
self.greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
}
}
참고: https://velog.io/@sso0022/iOS-MVC-%EC%99%80-MVVM
https://gwangyonglee.tistory.com/49