[iOS]dequeueReusableCellWithIdentifier-셀 재사용

이슈 📑 

  •  아래 사진처럼 Collection View Cell의 dequeueReusableCellWithIdentifier의 이슈입니다. 
  • Cell이 재사용의 될 때 해당 Cell의 데이터도 그대로 재사용이 되었습니다.

문제의 사진

dequeueReusableCellWithIdentifier 📎

  • 원리 
  • Table View 위로 스크롤 되어 화면에서 사라지는 Cell은 Queue(큐)로 들어가고 Queue(큐)의 front에 있는 Cell이 화면의 하단에서 올라와 화면에 보여지는 셀로 사용된다. 
  • dequeue & reuse는 cellForRowAt 메소드에서 dequeueReusableCellWithIdentifier 함수를 통해 이루어지는데 셀에 configure(구성)되는 데이터소스의 내용은 다르지만 셀 자체는 재사용되기 때문에 content와 무관한 것들(alpha, editing, selection sate)까지 재사용하게 되는 것이다.

dequeueReusableWithIdentifier

  • 이해를 위해 쉽게 예를 들어 보겠습니다.
  • 우리가 표시해야할 Cell의 데이터가 100개가 있고, 화면에 표시되는 Cell의 갯수는 10개라고 했을 때 우리는 한번에 100개의 Cell을 만들 필요가 없습니다.
  • 화면에 해당 Cell이 보일 때 그 셀에 알맞는 데이터만 넣어주면 됩니다.
  • 그래도 미리 만들어놓으면 이런 이슈들이 발생 안하지 않나? 라는 의문이 든다면 Cell 재사용의 가장 큰 장점을 소개하겠습니다 ❗️
  • 이 메소드(dequeueReusableWithIdentifier)를 가장 큰 이유는 메모리를 줄이기 위함입니다.
  • 재사용해서 사용하는 Cell은 이미 할당된 메모리의 셀을 재사용하는 것이기 때문에 추가적인 메모리 손실이 없기 때문입니다.
  • But❗️ Cell을 제대로 초기화 해주지 않으면 "문제의 사진"처럼 기존 Cell의 데이터가 재사용되면서 다른 Cell까지 영향을 줍니다.
  • 이에 해결 방법으로 prepareForReuse() 메소드를 조사해보았습니다.

 

prepareForeReuse 🖇

  • Apple Developer에 따르면 Prepares a reusable cell for reuse by the table view's delegate 라고 설명되어 있다. 이는 테이블 뷰의 대리자(delegate)가 재사용할 수 있도록 재사용 가능한 셀을 준비하는 것 입니다.

prepareForReuse()

 Apple Developer에서는 이 메소드를 재정의(오버라이드)할 때 반드시 슈퍼클래스 구현을 호출해야한다고 합니다.
  • 이번엔 호출되는 시점을 아래 사진을 통해서 살펴보겠습니다.

prepareForReuse()

  • 위 사진만으로도 prepareForReuse()가 호출되는 시점을 알 수 있습니다.
  • Cell이 queue(큐)에서 다시 reuse(재사용)가 될 때 prepareForReuse()를 걸쳐서 초기화를 한 후 다시 cellForeRowAt를 통해 Cell이 표시가 됩니다.
prepareForReuse()를 사용할 때 모든 재사용되는 Cell에 대해 초기화해버리면 이미 Push out 된 Cell도 초기화가 됨으로 데이터를 확인해서 다시 보여주게끔 해야 합니다.
  • 이 메소드를 통해 문제를 해결하려고 했으나 데이터가 없는 경우(else)부분만 추가해주면 해결되는 문제였습니다.
  • 결국 if ~ else문을 통해서 데이터가 "있을 때 || 없을 때" 모든 경우를 처리해 해결했습니다.
  • 그래도 prepareForReuse()와 dequeueReusableCellWithIdentifier를 더 자세히 알 수 있었던 기회였습니다.
  • 나중에라도 재사용되는 Cell에 대한 이슈가 생긴다면 그땐 주저없이 해결할 수 있을 것 같습니다.

'iOS_Swift.zip' 카테고리의 다른 글

[iOS]옵저버 패턴(Observer Pattern)  (0) 2022.01.05
[iOS]싱글톤 패턴(Singleton Pattern)  (0) 2022.01.04
[iOS]FSCalendar 사용 후기 & 사용법  (5) 2022.01.02
[Xcode]Info plist  (0) 2021.12.25
[Xcode]App Project  (0) 2021.12.23