• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

UITableView Cell Life Cycle

cellForRowAt, willDisplay, didEndDisplaying, prefetchRowsAt, cancelPrefetchingForRowsAt

ViewController에는 이런 함수들이 있다고 하고,

awakeFromNib, prepareForReuse, deinit

xib cell에는 이런 함수들이 있다고 하자.
그리고 한 화면에는 18개의 cell이 보이는 뷰!

시뮬레이터를 켜서 실행해보면! 스크롤 하기 전에 !! 그냥 시뮬 실행만 하고 안 건드렸을 때

-------------- [awakeFromNib] --------------

cellForRowAt: 0
Will Display Cell : 0

-------------- [awakeFromNib] --------------

cellForRowAt: 1
Will Display Cell : 1

-------------- [awakeFromNib] --------------

cellForRowAt: 2
Will Display Cell : 2

-------------- [awakeFromNib] --------------

cellForRowAt: 3
Will Display Cell : 3

-------------- [awakeFromNib] --------------

cellForRowAt: 4
Will Display Cell : 4

-------------- [awakeFromNib] --------------

cellForRowAt: 5
Will Display Cell : 5

-------------- [awakeFromNib] --------------

cellForRowAt: 6
Will Display Cell : 6

-------------- [awakeFromNib] --------------

cellForRowAt: 7
Will Display Cell : 7

-------------- [awakeFromNib] --------------

cellForRowAt: 8
Will Display Cell : 8

-------------- [awakeFromNib] --------------

cellForRowAt: 9
Will Display Cell : 9

-------------- [awakeFromNib] --------------

cellForRowAt: 10
Will Display Cell : 10

-------------- [awakeFromNib] --------------

cellForRowAt: 11
Will Display Cell : 11

-------------- [awakeFromNib] --------------

cellForRowAt: 12
Will Display Cell : 12

-------------- [awakeFromNib] --------------

cellForRowAt: 13
Will Display Cell : 13

-------------- [awakeFromNib] --------------

cellForRowAt: 14
Will Display Cell : 14

-------------- [awakeFromNib] --------------

cellForRowAt: 15
Will Display Cell : 15

-------------- [awakeFromNib] --------------

cellForRowAt: 16
Will Display Cell : 16

-------------- [awakeFromNib] --------------

cellForRowAt: 17
Will Display Cell : 17

-------------- [awakeFromNib] --------------

cellForRowAt: 18
Will Display Cell : 18
prefetch : [[0, 19], [0, 20], [0, 21], [0, 22], [0, 23], [0, 24], [0, 25], [0, 26], [0, 27], [0, 28]]

요런 식으로 콘솔에 출력이 된다고 한다 !

19개의 Cell이 생성되면서 awakeFromNib을 호출
tableView(:cellForRowAt:)**에 의해 셀들이 생성(메모리에 로드됨) 되면서 호출
화면에 보이지기 직전에 작업을 하는 **tableView(
:willDisplay:forRowAt:)
가 호출되는 식으로
셀 하나당 반복하게 되고 화면에 표시되는 셀의 갯수만 동작을 하게 된다!

그 후로는 prefetchRowsAt이 호출되는데, 화면에 표시되는 셀들 다음 셀부터 prefetching되는 것을 확인할 수 있다.
화면에 보이는 셀 이후의 셀들을 미리 호출하는 것 !

순서대로 함수 알아보기

awakeFromNib

  • nib 파일이 생성된 후 초기화 작업을 준비하는 곳.
  • MVC에서 ViewController를 상속받은 View가 아니라서 viewDidLoad가 없다.
  • Cell에서는 View의 역할을 하기 위해 awakeFromNib()이 존재한다
  • 여기서 초기화 작업을 진행한다

tableView(_:cellForRowAt:)

  • TableView의 특정 위치에 삽입할 Cell에 대해 Data Source에 요청하는 메서드

tableView(_:willDisplay:forRowAt:)

  • 테이블 뷰는 셀을 사용하여 행을 그리기 직전에 Delegate에게 이 메세지를 보냄
  • 즉, Delegate가 셀 객체를 그리기 전에 사용자가 정의할 수 있음

UITableViewDataSourcePrefetching

  • 디스플레이에 보여지는 셀 이외의 셀 정보를 미리 호출하여 데이터를 받아올 수 있는 프로토콜
  • 두가지 프로토콜 메서드가 존재하고, prefetchDataSource 프로퍼티도 존재한다.

image

스크롤하면?

-------------- [awakeFromNib] --------------

cellForRowAt: 18
Will Display Cell : 18
prefetch : [[0, 19], [0, 20], [0, 21], [0, 22], [0, 23], [0, 24], [0, 25], [0, 26], [0, 27], [0, 28]]

-------------- [awakeFromNib] --------------

cellForRowAt: 19
Will Display Cell : 19
prefetch : [[0, 29]]
Did End Display Cell : 0

-------------- [prepareForReuse] --------------

cellForRowAt: 20
Will Display Cell : 20
prefetch : [[0, 30]]
Did End Display Cell : 1

-------------- [prepareForReuse] --------------

cellForRowAt: 21
Will Display Cell : 21
prefetch : [[0, 31]]
Did End Display Cell : 2

-------------- [prepareForReuse] --------------

cellForRowAt: 22
Will Display Cell : 22
prefetch : [[0, 32]]
Did End Display Cell : 3

-------------- [prepareForReuse] --------------

cellForRowAt: 23
Will Display Cell : 23
prefetch : [[0, 33]]

19번째 cellForRowAt을 보면 tableView(_:didEndDisplaying:forRowAt:) 이 호출됨.

didEndDisplaying

테이블뷰로부터 cell이 화면에서 사라지면 호출되는 메서드

prepareForReuse

20번째 셀 부터는 awakeFromNib이 아니라 prepareForReuse가 호출되는데,
테이블뷰 delegate에 의해 재사용 가능한 셀을 준비하는 메서드임.

만약 셀이 재사용된다면 dequeueReusableCell(withIdentifier:) 메서드가 return되기 전 호출됨
성능상의 이유로, 컨텐츠과 관련 없는 alpha, editing, selection state같은 셀의 속성만 재설정해야 함

큐에 넣어졌던 셀을 재사용하기 때문에 더 이상 셀을 생성하지 않고 재사용하는 방법을 사용하는 것!
재사용된 셀을 사용할 땐 prepareForReuse()만 호출됨.

스크롤 맨 마지막에 닿았을 땐 지금까지 순서대로 진행됐던 로직이 반대로 진행됨

참고한 곳

여기여기