윈도우 창을 하나 닫는다고 생각을 해보자. 닫는 버튼을 눌러 윈도우 창을 단순히 끌 수 있다고 생각을 하지만, 만약 유저가 아직 저장하지 않은 데이터가 있거나 한다면 어떻게 될까? 그 윈도우와 연결된 다른 프로그램들이 있다면? 그러한 것들도 단순히 바로 종료가 되어야할까?


이것을 protocol-delegate pattern을 통해 해결할 수 있다. 우선 protocol을 정의 한다. 예를 들어 windowShouldClose: 라고 할 수 있겠다. 그래서 만약 유저가 윈도우 창을 끄기 위해 닫는 버튼을 누른다면, 다른 사람에게 이 윈도우를 꺼야 하는지 물어보게 된다. 물음을 당하는 이 사람이 바로 Delegate다.

여기서 만약 유저가 아직 저장하지 않은 데이터가 있다면, Delegate는 No라고 할 것이다.

이러한 protocol-delegate pattern은 모든 Apple의 생태계에서 사용된다.

UITableView가 있다면 willDisplayCell, willDisplayHeaderView, willDisplayFooterView와 같은 프로토콜을 가질 것이고, UITextField라면 textFieldShouldReturn, textFieldShouldClear, textFieldDidEndEditing과 같은 프로토콜을 가질 것이다. 그리고 Cocoa, UI-Kit을 통하여 셀 수 없이 많은 라이브러리들이 사용되고 있다.
이러한 패턴이 Apple library들에만 있는 것이 아니라 물론 우리와 같은 프로그래머도 정의하고 적용할 수 있다.


날씨를 제공하는 어플을 만들고 있다고 가정해보자. 날씨의 정보를 가져오는 fetchWhether이 오래걸리는 작업이고, 당연히 fetchWhether이 작업을 마칠때까지 메인 스레드를 잡고 있으면 안되니깐 asynchronous(비동기) call일 것이다. 이러한 상황에서 어떻게 protocol-delegate pattern의 도움을 받을수 있을까?

didFetchWeather 이라는 protocol을 정의하고 이것을 viewController에 언제 날씨 정보를 fetch했는지 묻고 답을 얻기 위해 적용을 시킨다. 그런 다음, 날씨 정보를 가지고 왔다면 delegate를 통해 작업을 완료하였다고 답을 할 것이다.

여기까지가 이론적인 protocol-delegate pattern의 개념이다.


실제 코드에 적용시키기 위해서는 순서는 아래와 같다.

  1. protocol 정의
  2. weatherService.delegate = self 와 같은 delegate 등록 절차
  3. method call (실행 시작), method 종료
  4. 종료 시, delegate?.didFetchWeather(weather)과 같은 delegate pointing을 가지고 있기에 이를 알려주고 최종적으로 viewController에 있는 didFetchWeather 함수가 실행되며 UI를 업데이트 하게 된다.

    이와 아주 유사한 data source pattern이 있다. 동작 flow는 동일하지만, object로 이러한 것들을 처리하게 된다.

태그:

카테고리:

업데이트: