https://ios-development.tistory.com/75
버튼을 누르면 안녕메시지가 나오는 기본적인 앱이다.



MVC의경우 Model, Controller, VIew 3가지 중점
iOS 경우 view와 controller가 공존 controller에 많은 부하가 발생 , 코드가 길어지고 유지보수가 힘들어짐.
import UIKit
struct Person { // Model
let firstName: String
let lastName: String
}
class GreetingViewController : UIViewController { // View + Controller
var person: Person!
let showGreetingButton = UIButton()
let greetingLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.showGreetingButton.addTarget(self, action: "didTapButton:", forControlEvents: .TouchUpInside)
}
func didTapButton(button: UIButton) {
let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
self.greetingLabel.text = greeting
}
// layout code goes here
}
// Assembling of MVC
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
view.person = model;
간단한 앱을 구현하는데 유리한 디자인 페턴이다.

MVC는 View와 Model사이의 의존성이 존재하지만 MVP에서는 둘사이의 의존성을 제거하고 Presenter를 중간에 두어 데이터를 데신 받음 또한 presenter는 view controller의 생명주기에는 관여하지 않음.
import UIKit
struct Person { // Model
let firstName: String
let lastName: String
}
protocol GreetingView: class {
func setGreeting(greeting: String)
}
protocol GreetingViewPresenter {
init(view: GreetingView, person: Person)
func showGreeting()
}
class GreetingPresenter : GreetingViewPresenter {
unowned let view: GreetingView
let person: Person
required init(view: GreetingView, person: Person) {
self.view = view
self.person = person
}
func showGreeting() {
let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
self.view.setGreeting(greeting)
}
}
class GreetingViewController : UIViewController, GreetingView {
var presenter: GreetingViewPresenter!
let showGreetingButton = UIButton()
let greetingLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.showGreetingButton.addTarget(self, action: "didTapButton:", forControlEvents: .TouchUpInside)
}
func didTapButton(button: UIButton) {
self.presenter.showGreeting()
}
func setGreeting(greeting: String) {
self.greetingLabel.text = greeting
}
// layout code goes here
}
// Assembling of MVP
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
let presenter = GreetingPresenter(view: view, person: model)
view.presenter = presenter
코드를 보면 presenter는 view를 의존하고 있음.
view와 presenter가 1대 1관계(의존성을 갖기 때문인듯)
presenter는 view를 의존하지만 vm은 view를 의존하지 않고 데이터 바인딩을 통해서 구현함으로서 의존성을 낮추자
view와 ViewModel은 1대 n