재사용 메커니즘 : 테이블 뷰가 출력해야할 데이터가 많을 경우, 이를 한꺼번에 셀로 만들어 처리하면 메모리 소모가 많아 스크롤이 버벅대는 현상이 발생한다 --> 재사용 메커니즘은 이 같은 현상을 방지하고 물흐르듯 자연스러운 스크롤을 제공하기 위해 도입한 개념이다.
테이블 뷰는 표현해야할 목록이 아무리 많아도, 목록 전부를 한꺼번에 셀로 생겅하지 않는다
메모리를 절약하기 위해서 화면에 보여줄 수 있는 딱 그만큼만 셀을 생성해서 출력한다.
나머지 셀은 스크롤이 발생했을 때 생성해서 목록에 추가하며 동시에 스크롤에 의해 화면에서 벗어난 셀은 목록에서 뺀다.
이때, 매번 새로운 셀을 계속 생성하는 것은 부담일 수 있다. 또한 화면에서 벗어나 목록에서 제외된 셀 객체를 메모리에서 아예 지워버리는 것 역시 성능상 낭비!!
따라서 iOS는 목록에서 제외된 셀을 지우지 않고 재활용 해서 다시 사용할 수 있도록 처리하는데 이것이 바로 재사용 메커니즘의 핵심!!
스크롤에 의해 목록 제일 위 또는 아래의 테이블 셀이 화면을 벗어나면, 이 셀은 목록에서 제거된 후 임의의 저장소에 저장됨.
자신이 다시 사용될 날을 기다리면서 휴식을 취함.
이 저장소 내부에는 먼저 저장된 셀들이 소멸하지 않고 대기하고 있다가, 새로운 테이블 셀이 필요하다는 요청을받으면 순서대로 불려 나간다.
그리고 다시 데이터나 콘텐츠를 입력받으면, 새로운 셀처럼 꾸민 다음에 목록에 추가된다. 이 흐름은 사용자가 테이블 뷰를 스크롤 하는 동안 발생
이 과정에서 화면 바깥으로 벗어난 셀이 재사용되기 전까지 머무는 장소가 바로 재사용 큐 - FIFO 방식
dequeueReusableCell(withIdentifier:) 메소드는 재사용 큐에 대기하고 있는 셀을 꺼낼 때 호출하는 메소드
이 메소드는 재사용 큐를 뒤져서 대기하고 있는 셀 인스턴스가 있다면 이를 꺼내어 제공하고 없다면 nil 반환
이 메소드를 호출할 때는 "menucell" 처럼 원하는 객체를 가르키는 값을 인자값으로 넣어주어야 한다.
재사용 큐에는 재사용 메커니즘을 따르는 여러 종류의 객체들이 저장되어 있으므로 그 중에서 우리가 원하는 건 ooo 이니 이 이름으로 캐싱되어 있는 셀이 있으면 꺼내주세요!! 하고 상세하게 요청해야 하기 떄문이다. 이것을 재사용 식별자라고 한다
하지만 셀을 제공하는 재사용 큐 입장에서는 로직상의 문제가 하나 있는데, 처음에는 재사용 큐에 캐싱된 것이 없어서 다짜고짜 무조건적으로 내놓으라고 하면 문제가 발생ㅎ나다. 따라서 재사용 큐는 처음에 nil을 내놓을 수 밖에 없다.
우리는 이런 상황을 방지하기 위해 애초에 이것을 "menucell" 이라는 이름으로 요청할 터이니 그때 가서 없으면 만들어서 똑같이 만들어라도 주면 좋겠어요 하고 정중히 요청하기.
인터페이스 빌더에서 인스펙터의 Idenrifier에 식별자를 입력하는 작업이 바로 이 요청에 해당한다!!
하지만 꼭 이 과정을 스토리 보드에서만 처리해야하는 것은 아니다.
잘 생각해보자. 스토리보드에서 가능한 모든 작업은 커스텀 코드에서도 가능한데, 재사용 큐를 위한 셀을 등록하는 작업 역시 마찬가지!!
// 재사용 큐로부터 테이블 셀을 꺼내 온다.
let id = "menucell" // 재사용 큐에 등록할 식별자
var cell = tableView.dequeueReusableCell(withIdentifier: id)
// 재사용 큐에 menucell 키로 등록된 테이블 뷰 셀이 없다면 새로 추가한다.
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: id) // 여기 코드가 커스텀을 위한 코드
}
** 아래 코드로도 대체 가능
let cell = tableView.dequeueReusableCell(withIdentifier: id) ?? UITableViewCell(style: .default, reuseIdentifier: id) 로 대체 가능
커스텀 코드를 보면 두번째 매개변수를 키로하여 재사용 큐에 캐싱이 됩니다.
** 엄연히 말해서 스토리보드에 작성한 것과 완전히 똑같은 방식은 아닙니다.
프로토타입 셀의 reuseIdentifier가 등록된 셀 정보를 이용하여 계속 셀을 재생산 하는 것과 달리 하나의 새로운 셀을 생성하고 사용이 끝나면 저장될 수 있도록 reuseIdentifier 부여해 주는 역할일 뿐이라서, 캐싱된 셀이 없을 때마다 매번 실행해 주어야 하기 때문에 조금 다르다.
실제로 동일한 메커니즘으로 작용하는 구문은
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: id) 이다.
'deprecated > 꼼꼼한 재은씨 시리즈' 카테고리의 다른 글
데이터 저장 기본 (0) | 2021.03.26 |
---|---|
사이드 바 실제 적용시 고려하면 좋은 것들 (0) | 2021.03.21 |
SWRevealViewController (사이드바) - 외부라이브러리 1 (0) | 2021.03.19 |
커스텀 클래스(3) - 커스텀 스테퍼 (0) | 2021.03.19 |
커스텀 클래스(2) - 커스텀 탭 바 컨트롤러 (0) | 2021.03.19 |