Delegate Pattern

Groot·2022년 6월 7일
0

TIL

목록 보기
12/153
post-thumbnail
post-custom-banner

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Delegate Pattern

📍 Protocol

  • 특정 작업이나 기능에 필요한 메서드, 속성 및 기타 사항에 대한 틀만 만드는 것
  • 프로토콜을 채택하는 곳에서 실제 구현이 이루어진다.

📍 Delegate Pattern

  • 어떤 객체가 해야 하는 일을 부분적으로 확장해서 대신 처리를 한다.
  • 특정 작업에 응답하거나 외부 소스에서 데이터를 전달 받을 수 있다.

📍 Delegate Pattern 사용한 데이터 전달

  • FruitStoreViewController에서 JuiceMakerViewController 로 dismiss 될 때 delegate패턴을 사용하여 데이터를 전달하도록 구현.
    1. delegate pattern을 위해 사용할 프로토콜을 정의. 과일 재고를 저장할 딕셔너리 타입을 파라미터로 사용.
protocol FruitsStockDelegate: AnyObject{
    func updateFruitsStock(_ fruitStocks: [Fruit: Int])
}
    1. JuiceMakerViewController에서 FruitStoreViewController로 present될 때 delegate를 연결해주기 위해 modalViewController의 delegate를 지정.
private func presentModalViewController(withId: String) {
        guard let modalViewController = storyboard?.instantiateViewController(withIdentifier: withId) as? FruitStoreViewController else {
            return
        }
        modalViewController.modalPresentationStyle = .fullScreen
        modalViewController.fruitsStock = juiceMaker.requestCurrentStock() ?? [:]
        modalViewController.delegate = self
        self.present(modalViewController, animated: true)
    }

    1. FruitStoreViewController에서는 다시 과일 재고를 나타내는 fruitsStock딕셔너리를 이전 뷰인 JuiceMakerViewController에게 위임. 아울러 FruitStoreViewController는 FruitStockDelegate를 채택.
@IBAction private func pressBackBarButton(_ sender: UIButton) {
        delegate?.updateFruitsStock(fruitsStock)
        dismiss(animated: true)
}

    1. 위임받은 JuiceMakerViewController는 최종적으로 FruitStoreViewController로부터 과일 재고를 받아 수정하는 함수를 호출.
// JuiceMakerViewController.swift
extension JuiceMakerViewController: FruitsStockDelegate {
    func updateFruitsStock(_ fruitStocks: [Fruit : Int]) {
        postFruitsStockDelivered(fruitStocks)
    }
}

📍 Delegate 어려웠던 점

  • 기존에 생각한 방향은 JuiceMakerVC -> FruitStoreVC 데이터 전달방식으로 사용
  • 대리자 지정 전에 함수를 실행하였기 때문에 정상적으로 동작하지 않음
  • 상위에서 하위로 가는 데이터 전달에선 Delegate를 잘 사용하지 않고, 하위에서 다시 상위를 모르는 상태에서 상위로 데이터를 전달하는 과정에 사용
  • Delegate 사용 시 순환참조 문제
    • 이 문제를 해결하기 위해 약한 참조 방식( 예: weak var delegate: NewDelegate? )
    • ARC를 이해해보자.
profile
I Am Groot
post-custom-banner

0개의 댓글