tableView 강의를 듣다가, 궁금해서 글을 남깁니다.
cellForRowAt 함수가 cell 마다 한번씩 호출이 되는건가요? section마다 한번씩 호출되는건가요?
그리고 스크롤하면서 재사용이 될 때는 어떤 방식으로 호출이 되는지 궁금합니다!
tableView(_:cellForRowAt:) 함수는 TableView의 특정 위치에 삽입할 Cell에 대해 Data Source에 요청하는 함수입니다. cell을 하나씩 생성할 때마다 호출됩니다.
cell은 모든 목록만큼 만들어지지 않고 화면에서 보여줄 수 있는 만큼만 생성하고 스크롤 시 재사용합니다.
스크롤을 통해 화면이 내려가면 새로 올라오는 cell들은 reuse queue를 확인해서 재사용할 cell이 있으면 그것을 사용하고, 없으면 새로 생성해서 사용합니다.
메모리의 관리를 위해서 필요한 부분입니다. 모든 cell을 다 생성하지 않기 때문에 메모리를 절약할 수 있습니다.
재사용을 가능하게 하는 것이 dequeueReusableCell입니다.
스크롤을 통해 화면에서 사라지면 reuse queue에 사라진 cell을 저장시키고 새로운 cell을 필요로 할 때 queue에서 cell을 가져와 재사용합니다.
재사용된 cell을 사용할 때는 prepareForReuse()가 호출됩니다.
답변 감사드립니다:) 좀 질척되는 질문인데요… ^^;;
많은 부분 이해가 되는데, cell을 하나씩 '생성’할 때마다 datasource가 호출된다는 점에서 제가 cellforRows에 프린트를 찍어보니 '재사용’될 때도 호출이 되던데 어떻게 이해하면 좋을까요?
그리고 같은 화면(같은 갯수의 cell)에서 재사용이 일어나지 않고 생성이 일어나는 경우는 어떤 경우일까요? 말씀하신 대로라면 사라지는 셀의 갯수와 새롭게 나타나는 셀의 갯수가 같은 화면에서는 달라지지 않을 것 같아서 여쭤봅니다:) 질척여 죄송합니다 ㅠ
tableView(_:cellForRowAt:) 함수는 크게 다음 두 가지 작업을 해야합니다.
- 셀 객체 준비
- 해당 위치에 맞는 콘텐츠 반영
셀 객체를 준비하는 방법은 다음 두 가지가 있습니다.
1-1. 셀이 없는 경우에 새로 생성
1-2. 재사용된 셀이 있으면 사용
재사용된 셀에는 재사용되기 전의 콘텐츠가 반영되어 있으므로, 새로운 콘텐츠로 업데이트해야 합니다.
생성이라는 단어로 인해 모호함이 생긴 것 같습니다.
wannabewize님께서 답변하신 것처럼
cell이 필요한 경우에 함수가 호출되고, 그때에 cell 객체를 준비하는 과정에서
queue에 셀이 없는 경우에는 새로 생성하고 재사용될 셀이 있으면 그것을 재사용하게 됩니다.
쉽게 view의 재사용이라고 생각하시면 될 것 같습니다. (이 부분은 특정 cell의 background color를 바꿔보고 스크롤 해보면 어떤식으로 재사용되는 지 확인해보실 수 있습니다.)
재사용되지 않고 생성이 일어나는 경우는 처음 만들어질 때 생성된다고 보시면 될 것 같습니다. 아마 그 이후에는 거의 재사용을 하게 되겠죠. 이 부분은 크게 생각하시지 않으셔도 되는 부분인 것 같습니다.
답변 감사합니다! 그냥 습관적으로 코드만 따라 적었는데, 이해하고 접근하니 활용에 더 도움이 되는 것 같습니다:)