Swift에서의 prepareForReuse() 함수

jeongmuyamette·2025년 3월 9일

TIL

목록 보기
60/72
post-thumbnail

Swift에서의 prepareForReuse() 함수

정의

prepareForReuse()는 UIKit 프레임워크에서 UITableViewCellUICollectionViewCell 클래스에 정의된 메서드입니다. 이 메서드는 셀이 재사용되기 직전에 호출되며, 셀을 초기 상태로 재설정하는 데 사용됩니다. 테이블 뷰나 컬렉션 뷰에서 셀을 재활용할 때 이전 데이터가 새로운 셀에 남아있는 것을 방지하기 위한 목적으로 사용됩니다.

비유

prepareForReuse()는 호텔 객실 청소와 같습니다. 한 손님이 체크아웃하고 다음 손님이 체크인하기 전에, 객실을 깨끗하게 청소하고 모든 것을 초기 상태로 되돌려 놓습니다. 이전 손님의 흔적(데이터)이 남아있으면 새로운 손님(새 데이터)에게 혼란을 줄 수 있기 때문입니다.

예시

class CustomTableViewCell: UITableViewCell {
    
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var detailImageView: UIImageView!
    var downloadTask: URLSessionDataTask?
    
    override func prepareForReuse() {
        super.prepareForReuse()
        
        // 레이블 텍스트 초기화
        titleLabel.text = nil
        
        // 이미지 초기화
        detailImageView.image = nil
        
        // 진행 중인 네트워크 작업 취소
        downloadTask?.cancel()
        downloadTask = nil
    }
    
    func configure(with item: Item) {
        titleLabel.text = item.title
        
        // 이미지 다운로드 작업 설정
        if let imageURL = item.imageURL {
            downloadTask = URLSession.shared.dataTask(with: imageURL) { [weak self] data, _, _ in
                if let data = data, let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.detailImageView.image = image
                    }
                }
            }
            downloadTask?.resume()
        }
    }
}

이 예시에서:
1. prepareForReuse() 메서드를 오버라이드하여 셀이 재사용되기 전에 필요한 초기화 작업을 수행합니다.
2. 레이블 텍스트와 이미지를 nil로 설정하여 이전 데이터가 새 셀에 표시되지 않도록 합니다.
3. 진행 중인 네트워크 작업이 있다면 취소하여 불필요한 리소스 사용을 방지합니다.

사용 순서와 호출 시점

  1. 셀 생성: 테이블 뷰나 컬렉션 뷰가 처음 로드될 때 셀이 생성됩니다.
  2. 셀 구성: cellForRowAt 또는 cellForItemAt 메서드에서 셀의 내용을 구성합니다.
  3. 셀 화면 밖으로 스크롤: 사용자가 스크롤하면 일부 셀이 화면 밖으로 이동합니다.
  4. 재사용 큐에 들어감: 화면 밖으로 나간 셀은 재사용 큐에 들어갑니다.
  5. prepareForReuse 호출: 재사용 큐에서 셀이 꺼내져 다시 사용되기 직전에 prepareForReuse() 메서드가 호출됩니다.
  6. 셀 재구성: 셀이 새 데이터로 다시 구성됩니다.

이 과정을 통해 메모리 사용을 최적화하고 사용자 인터페이스의 일관성을 유지할 수 있습니다.

0개의 댓글