예제 설명

https://ios-development.tistory.com/75

버튼을 누르면 안녕메시지가 나오는 기본적인 앱이다.

스크린샷 2022-11-08 오후 5.08.54.png

스크린샷 2022-11-08 오후 5.09.02.png

MVC

Untitled

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;

간단한 앱을 구현하는데 유리한 디자인 페턴이다.

MVP

스크린샷 2022-11-08 오후 5.42.08.png

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관계(의존성을 갖기 때문인듯)

MVVM

presenter는 view를 의존하지만 vm은 view를 의존하지 않고 데이터 바인딩을 통해서 구현함으로서 의존성을 낮추자

view와 ViewModel은 1대 n