Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
UIKit/UIKit

DequeueReusableCell ?? 테이블뷰와 셀

by Toughie 2023. 2. 28.

 

TableView를 활용하면 Cell의 개념은 필수이다.

 

TableView 구현을 위해서는 ViewController에서 확장을 통해 UITableViewdataSource, UITableViewDelegate

두 프로토콜을 채택하는 것이 일반적이다.

 

우선 셋업단계에서 TableView에 Cell을 identifier를 통해 Register 한 후에

tableView cellForRowAt 메서드에서 셀에 대한 설정들을 해준다.

여기서 셀 인스턴스를 생성할 때, 아래와 같은 메서드를 통하는데 정확히 어떤 메서드인지 궁금해졌다.

let cell = tableView.dequeueReusableCell(withIdentifier: "identifier",
for: IndexPath) as! MyCell

dequeueReusableCell(withIdentifier:for:) 메서드는 UITableView 클래스에 있는데,

해당 메서드를 사용하면 재사용가능한 UITableViewCell 인스턴스를 얻을 수 있다. 재사용 가능..??

 

테이블뷰가 엄청나게 많은 셀들을 표시해야 하는 상황이라면(데이터가 엄청 많아서) 스크롤 할 때마다 매 번 새로운 셀을 만드는 것보다,

이제 안보이는 셀들(스크롤 해서 위나 아래로 올라가버린)을 다시 사용하는게 더욱 효율적이다.

어짜피 유저 눈에 보이는 영역은 화면이 전부이기 때문에.. 정말 재사용 가능한 유리컵 같은 느낌으로 이해하면 좋다.

유저가 아래로 스크롤을 하면 위에 있던 컵(셀)에 내용물을 비우고, 씻어서 새로운 음료(새로운 데이터)를 컵(셀)에 담아서 올라오는 것이다.

 

셀은 힙메모리에 저장되기때문에 셀이 만약 복잡하고 포함하는 컨텐츠가 많다면 새로운 셀을 계속 찍어내는것은 오버헤드가 발생할 것이다.

 

<구체적인 작동 방식>

셀을 재사용하기 위해서 테이블뷰는 현재 화면에서 눈에 보이지 않는 셀들을 모아서 관리하고 있는다.(reuse pool)

테이블뷰가 새로운 셀을 표시할 필요가 있으면, 먼저 reuse pool에서 현재 재사용 가능한 셀이 있는지 체크한다.

재사용 가능한 셀이 있다면 셀을 reuse pool에서 꺼내고 새로운 데이터와 적합한지 확인한 후, caller(요청한 객체)로 전달한다.

만약 재사용 가능한 셀이 없다면, 그제서야 새로운 셀을 만들어서 caller에게 전달한다.

 

셀을 테이블 뷰에 등록하고,

reuse pool을 통해 셀을 재사용가능하도록 관리하고

새로운 데이터를 담을 셀이 필요할 때마다 reuse pool에 접근해 셀을 달라고 요청하고

있으면 꺼내 주고(dequeue) 없으면 새로 찍어낸다는 것이다.

 

모바일 기기 특성상 화면도 작고, 메모리도 데스크탑 대비 비교적 작기 때문에

가장 효율적으로 데이터를 처리하고, 보여줄 수 있는 고민들이 코드에 녹아있는 것 같아서 재미있다 :)

 

iOS의 효율적인 처리방식을 믿고, 그 원리를 조금씩 이해해 가면서 주어진 프레임워크들을 활용해 나가다보면 

필요에 맞게 커스텀할 수 있는 능력도 생길 것이라 믿어 의심치 않는다. (필요하면 만들어야지 뭐)