Protocol - Delegate Pattern

YongJunCha·2021년 12월 21일
0
post-thumbnail

What is Protocol - Delegate Pattern

  • 스스로 이 개념을 정의하자면 '어떤 기능에 대한 Delegate Protocol을 준수한다면 해당 기능과 콜백 함수를 통해 커뮤니케이션이 가능해진다' 라고 생각한다.

Code Lab

struct Weather {
    let cityName : String
    let temperatuer : Double
    
    var temperatureString: String {
        return String(format: "%.0f", temperatuer)
    }
}
protocol WeatherServiceDelegate: AnyObject {
    func didFetchWeather(_ weatherService: WeatherService, weather: Weather)
}
  • fetch가 끝났을 때 불릴 protocol 정의
struct WeatherService {
    
    var delegate : WeatherServiceDelegate?
    
    func fetchWeather(cityName: String) {
        let weather = Weather(cityName: "Hong Kong", temperatuer: 33)
        delegate?.didFetchWeather(self, weather: weather)
    }
}
  • 상기의 func fetchWeather에서 weather 변수의 세팅이 끝난 후
delegate?.didFetchWeather(self, weather: weather)
  • 상기의 코드를 콜한다.
extension WeatherViewController: WeatherServiceDelegate {
    func didFetchWeather(_ weatherService: WeatherService, weather: Weather) {
        // Update UI
        temperatureLabel.attributedText = makeTemperatureText(with: weather.temperatureString)
        cityLabel.text = weather.cityName
    }
}
  • 그러면 상기의 코드와 같이 WeatherServiceDelegate를 준수하고 있는 곳에서 콜백 함수가 동작하며
  • func fetchWeather의 종료 시점에 맞춰 정확히 UI를 업데이트 시켜줄 수 있다.

When To Use

  • Passing information back from child to parent ViewController
  • Want source of information but far from where it is set

Conclusion

  • 상기의 코드랩은 가장 간단히 Protocol - Delegate Pattern을 구현한 예시이다.
  • 현재의 프로젝트는 대부분 Combine으로 진행되어 있는데 장단이 존재하는 것 같다.
  • Protocol - Delegate Pattern를 사용한다면 기능의 문서화나 모듈화가 쉬워질 것 같다.
  • Combine Future를 사용하는 것과 Protocol - Delegate Pattern으로 커뮤니케이션 하는 것 둘 중 어떤 것이 어느 상황에서 좋은지 연구가 필요할 것 같다.
  • 직접 만들지는 않았지만 MVVM 패턴에는 쓰기 어렵지 않을까 예상해본다.
  • 공식 문서를 훨씬 더 잘 이해할 수 있게 되었다.

0개의 댓글