티스토리 뷰

iOS

[iOS] prepareForReuse란?

Sueaty 2021. 10. 19. 03:30

저도 필요에 따라 prepareForReuse를 잘 쓰고 있는데요, 지난 블로그 포스팅에서도 몇 번 언급을 했었어요.

1. [Rx] Resuable Cell의 흔적이 남는다 [바로가기]

2. [Toy] collectionview의 cell이 업데이트가 잘 안된다 [바로가기]
제목에서도 두 글의 공통점이 보이지 않나요?ㅎㅎ

첫 번째는 UIScrollView를 상속하는 view들의 cell과 관련 된 이야기라는 것(UITableView, UICollectionView)이고

두 번째는 변화에 대한 대응이 문제가 되는 순간들이죠.

 

재사용 되는 cell을 dequeue 할 때 이전에 사용 되었던 흔적이 남을 때 prepareForReuse를 통해 해결을 하곤 했는데요,

정확히 어떠한 이유로, 어떤 목적을 위해 만들어진 메소드이지 알아보도록 하겠습니다.

prepareForReuse에 대한 문서는 2개가 존재해요.

UITableViewCell 하위에도 하나 있고, UICollectionReusableView 밑에도 하나가 있죠.

(UICollectionViewCell은 UICollectionReusableView를 상속하는데, 이 외에도 UICollectionViewListCell

 

UITableViewCell > prepareForReuse

UITableView의 delegate가 reusable cell이 재사용 될 수 있도록 준비할 수 있는 메소드에요.

tableView(_:cellForRowAt:)에서 원래 해당 cell의 content를 reset을 하기 때문에,

성능을 위해서 prepareForReuse 메소드 안에서는 content와 무관한 property들만 reset 하는게 좋습니다.

content와 무관한 property를 초기화하는 예시는 아래와 같아요.

override func prepareForReuse() {
   super.prepareForReuse()
   
   isHidden = true
   subview1.removeFromSuperview()
}

성능 이슈로 하지 말라고 하는 예시는 아래와 같아요.

override func prepareForReuse() {
   super.prepareForReuse()
   
   imageView?.image = nil
}

 

그리고 보시다시피 override 해서 사용할 경우 부모의 행동을 따라줘야 하니 잊지 않고 불러줘야 하고,

위에서 언급했듯이 content와 관련된 reset은 cellForRowAt에서 가능하기 때문에, 여기서 해주는게 좋답니다!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   if let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) {
      cell.imageView?.image = image ?? defaultImage
      return cell
   }
   
   return UITableViewCell()
}

이 코드처럼 reuse identifier

UICollectionReusableView > prepareForReuse

UICollectionReusableView도 별반 다르지 않습니다.

view를 재사용할 때 필요한 정리 작업을 하고 초기값들을 정해줄 수 있고, 새로운 data(위에서 content)를 배정해줄 떄 쓰면 안됩니다.

만약 UICollectionReusableView를 상속하는 클래스를 만들었다면 역시 super를 통해 부모 메소드 호출해야합니다.

위에서 설명이 안되었던 것 중 하나가 불리는 시점이에요.

위의 코드를 예로 그대로 써보면, deque를 진행하고 return cell을 하기 전에 먼저 불립니다.

 

출처

Apple Developer Document - UITableViewCell > preapreForReuse

Apple Developer Document - UICollectionReusableView > prepareForReuse

StackOverflow - What is the correct way to use prepareForReuse?

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함