View Model과 View Controller 간의 데이터 변경에 대해 알려줄 수 있는 방법
class Observable<T> {
private var listener: ((T) -> Void)?
var value: T {
didSet { // 값이 변한 다음에 실행
listener?(value)
}
}
init(_ value: T) {
self.value = value
}
func bind(_ closure: @escaping (T) -> Void) { // 값을 연결하는 부분
closure(value)
listener = closure
}
}
ViewModel
var title: Observable<String> = Observable("Welcome")
// 이런식으로 view model에서 지정
ViewController
viewModel.title.bind { value in
DispatchQueue.main.async {
self.titleLabel.text = value
}
}
// 이런식으로 등록할 이벤트를 클로저로 구현
@Published var employees: [Employee] = []
// ViewModel에서 바인딩할 변수를 Published로 감싸준다.
private var cancellables: Set<AnyCancellable> = []
private func bindViewModel { // B.
viewModel.$employees.sink { [weak self] _ in
self?.showTableView()
}.store(in: &cancellables)
}
ViewController에서 binding을 진행하는데, 여기서 AnyCancellable은 뭐지?
현재 이벤트 및 작업의 취소에 대해 지원하는 프로토콜
- cancel() 메서드를 호출함으로 리소스에 대해 해제
=> 타이머, 네트워크 엑세스, 디스크I/O와 같은 사이드 이펙트 발생을 막아준다.