본문 바로가기

Swift/Foundation

MVC Design Pattern

글에 들어가기 앞서 mvc 이론적인 부분이 아닌, 실제로 프로젝트에 적용할 때 필요한 정보에 대해서 정리했다.


Model

Model -> ViewControll

model에서 viewcontroller로 정보를 보내는 건 model이 viewcontroller를 알고 있는 것처럼 느껴진다.

사실 아래에 있는 KVO, Notification은 viewController가 model을 감시하는 구조이다.

model은 viewController을 몰라야 한다.

 

KVO observer에게 감시받는 속성을 갱신한다.

extension Model: ViewDataSoure, Datable {  
	func someMethod(newData: Data) {       
		self.information = newData   
	}
	...
}

 

Notification notification center로 정보를 전송한다.

NotificationCenter.default
			.post(name: NSNotification.Name("model"),
				object: nil,
				userInfo: ["information": game])

 

Completion Closure

extension Model: ViewDataSoure, Datable {  
func someMethod(newData: Data, completion: (Datable) -> Void) {  
		...Info 생성        
		completion(Info)   
	}
}

 

모델 객체는 뷰 객체나 뷰 프레임워크에 의존하지 않고 독립적으로 동작해야 한다. - JK

 

 

View

View -> ViewController

view에서 event가 발생한 걸 viewController로 보내기 위해 delegate 패턴을 사용한다.

 

weak var datasource: ViewDataSource?
var data: Datable?

@objc func didTouchedButton() {
	datasource.someMethod(newData: someData)
   	datasource.someMethod(newData: someData) { _ in ... }
}

view객체에서 신경 써야 할 부분은 model객체를 모르는 것이다.

datasource라는 속성을 구현해주는 대상을 몰라야 한다.

정보를 받아올 때 "model을 사용할 수밖에 없는 게 아닌가?" 의문점이 드는데 이 부분을 프로토콜의 다형성을 사용한다.

model이 특정 프로토콜을(Datable) 채택하게 만들어서 view에서는 그 특정 프로토콜을 받도록 만든다.(data: Datable?)

 

다른 객체를 참조하는 경우에는 구체 타입에 의존하지 않고, 프로토콜에 의존하도록 만든다.

 

ViewController

mvc 패턴에서 가장 중요한 역할을 하는 viewController. 

view와 model의 존재를 알고 있는 존재로서, event가 발생하면 model과 view를 묶어주는 역할을 담당한다.

ViewController -> Model

view에서 받은 자료를 model로 전달한다.

override func viewDidLoad() {
	...
	view.datasource = model  
}

 

ViewController -> View

model에서 받은 정보를 view에게 넘겨준다.

 

KVO

observer = dataManager.observe(\.model) { _, model in
    view.data = model.newValue
}

 

NotificationCenter

NotificationCenter.default.addObserver(self,
                                        selector: #selector(pushInformationToView),
                                        name: NSNotification.Name( "model"),
                                        object: nil)

@objc func pushInformationToView(_ notificaiton: Notification) {
    .... notifiaction.userInfo 사용
 }

 

mvc 패턴의 작동을 시간 순으로 나태는 그림이다.

 

'Swift > Foundation' 카테고리의 다른 글

Properties  (0) 2020.08.06
Dispatch Queue  (0) 2020.08.04
class, struct  (0) 2020.08.03
Bridging  (0) 2020.07.06
Out of Bounds  (0) 2020.06.28