본문 바로가기

카테고리 없음

Delegation 설명( Delegation Design Pattern

# Delegate, Delegation 이란?

사전적의미

Delegate
명사: (집단의 의사를 대표하는) 대표(자)
동사: (1)(권한업무 등을) 위임하다 (2)(대표를) 뽑다[선정하다]

Delegation
명사: (1)대표단 (2)위임

 

iOS에서의 사용

- 이벤트 발생시 약속된(protocol) 컨트롤러에게 알림이 가도록 되어있는 리모컨으로 묘사

- 리모컨과 TV 라고할 때 리모컨의 ON버튼은 TV를 ON하는것으로 약속되어있다

- 따라서 리모컨의 ON버튼이 클릭 될 시, TV라는 컨트롤러에서 ON이라는 함수가 실행된다. 여기 ON이라는 함수 안에는 TV를 출력하는 로직이 있다.


Delegation Degisn Pattern

- 하나의 객체가 다른 객체를 대신하여 동작 또는 조정할 수 있는 기능을 뜻함

- 주로 프레임워크 객체가 위임을 요청하며, (주로 애플리케이션 프로그래머가 작성하는)커스텀 컨트롤러 객체가 위임을 받아 특정 이벤트에 대한 기능을 구현합니다.

- 델리게이션 디자인 패턴은 커스텀 컨트롤러에서 세부 동작을 구현함으로써 동일한 동작에 대해 다양한 대응을 할 수 있게 해줍니다.

 

 

# 소스코드 예제

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate & UINavigationControllerDelegate {

    lazy var imagePicker : UIImagePickerController = {
        
        let picker: UIImagePickerController = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self

        return picker
    }()
    
    @IBOutlet weak var imageView: UIImageView!
    
    @IBAction func touchUpSelectImageButton(_ sender: UIButton) {
        self.present(self.imagePicker, animated: true, completion: nil)
    }
    
    // 이미지피커창이 종료될 때
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        
        print("이미지 창 종료!!")
        self.dismiss(animated: true, completion: nil)
    }
    
    // 이미지 선택시
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        print("이미지 선택!!")
        
        if let originalImage: UIImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            self.imageView.image = originalImage
        }
        
        self.dismiss(animated: true, completion: nil)
    }
}

 

# 결과

 

# 소스코드를 대입하여 다시 설명

 

위에 소스는 ImagePicker와 VC를 연결하는것으로 Delete부분은 ImagePicker에 선언되어있는 아래 두개 함수를 선언

 

(1) 이미지창이 종료될 때: func imagePickerControllerDidCancel

(2) 이미지가 선택될 때: func imagePickerController 

 

lazy var imagePicker 라는 UIImagePickerController의 인스턴스 변수를 생성

그리고 중요한 부분은

 

picker.delegate = self 

 

여기 부분으로 해석하자면 ImagePickerController가 Self에게 이벤트를 처리하는 대리인역할을 위임 하였고 이를 self에 해당되는 ViewController가 위임을 받는다.

  • 위에 적은 '하나의 객체가 다른 객체를 대신하여 동작 또는 조정할 수 있는 기능을 뜻함' 이 여기에 해당된다
  • ImagePickerController 와 ViewController는 위임(delegate)선언으로 서로 연결되었다
  • 리모컨(ImagePicker) 이고 TV(Self: ViewContorller)에 해당된다
  • 리모컨에는 두개의 이벤트(이미지창 종료, 이미지 선택)가 있다
  • 따라서 리모컨(ImagePicker)이벤트 발생시 연결된 TV에 맞는 이벤트함수(이미지 창 종료 또는 이미지선택)에 자동으로 연결이된다.

 

처음에는 바로 와닿지않았는데 다시 하나하나 읽다보니 이해되었고 리모컨과 TV라는 비유로 대입하였더니 좀 더 쉽게 이해되었다.