dequeueReusableCell Method Study

오늘은 지난번에 말했던 것 처럼 dequeueReusableCell Method에 대해 알아보는 시간입니다!!

에효,, 오늘도 먼 길을 가야 할듯한 느낌이,,,

destinationImg

그래도 화이팅 해서 가봅시다!!

먼저 dequeueReusableCell 이 뭔지 까먹엇을 수도 있으니 우리 한번 봐 볼까요??

dequeueImage

위의 그림에 나와있죠?? 반가워,, 다시만났네,,, ㅋㅋㅋ

일단 뭐든지 궁굼하고 모르겠으면 Documentation이나 Quick Help가 최곱니다!!

그럼 이 메소드가 어떤식으로 정의되었는지 메소드의 원형을 알아볼까요??

func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell

벌써부터 현기증이나네요,,,

이 메소드는 2개의 파라미터를 받는데 identifier 와 indexPath를 받네요

그리고 반환으로는 UITableViewCell을 반환합니다

자 그럼 하나씩 알아봅시다~

dequeueReusableCell(withIdentifier:for:)의 summary를 보면 다음과 같이 나와있어요

지정된 재사용 ID에 대한 재사용 가능한 테이블 뷰 셀 객체를 반환하고, 이를 테이블에 추가 합니다 라고 나와있어요

오호?! 뭔소리지??

qustionImg

차근 차근 뜯어 먹어봅시다

위의 그림에서 let cell = tableView.dequeueReusableCell(withIdentifier:”List”, for:indexPath)

우리가 사용한 코드는 위와 같은데 지정된 ID(식별자)라고 하는 것은 withIdentifier가 되겠죠?!

그럼 정확하게 이 identifier(ID)를 주면, 어떤일을 하는지 알아야지 조금 더 이해가 갈것같아요, 어떤일을 할까요??

역시 모를때는 Quick Help를 보면 되요ㅋㅋ

이 메소드의 파라미터인 identifier는 다음과 같이 나와있어요

재사용 할 셀 객체를 식별하는 문자열입니다, 이 매개변수는 nil이 아니어야 합니다

아~ 이 identifier는 재사용할 객체를 나타내는 문자열이군요 !!

그리고 이건 꼭 지켜줘야 해요 nil이 아니어야 한다는 점

다시 쉽게 정리해보면 우리가 지정해주는 string형 identifier는 재사용할 객체를 나타내주는 것이네요

이번엔 두번째 파라미터인 for에 대해 알아봅시다

for를 보면 Quick Help에는 다음과 같이 나와있어요

셀의 위치를 지정하는 인덱스 경로입니다. 데이터 소스는 셀에 대한 요청이 있을 때 이 정보를 수신하며 이를 전달해야 합니다. 이 방법은 인덱스 경로를 사용하여 테이블 뷰에서 셀의 위치를 기반으로 추가 구성을 수행합니다

우와~ 정말 길고 뭔말인지 모르겟죠??

저도 그래요 ㅋㅋ

그럼 같이 알아봐요!!

일단 위의 그림을 봐보면 for에 indexPath가 들어가 있어요

이 indexPath는 어디서 온걸까요?? 아,,,

identifier는 우리가 직접 지정해준걸로 알고 있는데 indexPath는 뭐지??

아래 그림을 한번 봐 볼까요??

indexPathImg2

그림에 나온것처럼 indexPath는 tableView 메소드 안에 있었어요

tableView 메소드는 파라미터로 UITableView와 IndexPath를 받네요?!!

즉, tableView 메소드에서 파라미터로 받은 IndexPath의 이름은 indexPath라고 해준거에요

그것을 당연히 이 메소드 안에서 사용이 가능하겟죠?!

오 조금은 dequeueReusableCell에 대해 알꺼같기도 하죠??

예를들어서 이야기를 이어나가면 이해가 조금 더 될꺼 같아요

만약에 내가 2500개의 항목(엔트리)를 가지는 테이블을 만들었다고 생각해봐요

그럼 테이블을 만들 때, 이 2500개의 엔트리를 셀마다 만들어야 할 것이고,

이 2500개의 테이블 뷰 셀에 대해 메모리 할당이 이루어지게 될거에요.

그럼 10만개면?? ㅇㅇ?? 10만개면 정말 많은 메모리가 들꺼에요

이를 방지하기 위해 나온것이 바로 dequeueReusableCell 입니다!!

이 dequeueReusableCell의 목적은 메모리를 재사용해 메모리를 줄이자! 입니다

그럼 실제 예를 한번 더 들어서 설명해볼게요

만약에 제가 화면에 테이블 뷰 셀을 10개를 볼 수 있다고 가정할게요

현재 화면이라는 점을 꼭 인지하고 예시를 들어봐야지 이해가 되니까 이점 기억하시고~

다시 본론으로 돌아와 나머지 뷰들은 스크롤해서 볼 수 있다고 생각해봐요

그럼, 이 테이블 뷰는 테이블 높이와 셀의 높이를 기반으로 정확하게 셀 수를 생성해요(10개를 말이죠 예를 들었으니까~)

그럼 지금 시점에서 메모리 할당은 10개의 셀에 대한 메모리 할당만 이루어지면 되는것이에요

근데 저는 밑에 셀도 보고싶어서 뷰를 스크롤 해봤어요

계속 동일한 셀이 사용되기는 하는데, DataSource를 기반으로 셀 내용이 바뀌게 되요

셀이 스크롤 되어 화면 밖으로 밀려서 나가게되면, 이 셀은 reuse poll에 들어가게 되고, 우리가 dequeueReusableCell을 호출할 때 테이블 셀에 의해 반환이 되죠.

아직도 조금 어렵다면 직접 코드로 구현해보고 직접 봐가면서 이해를 해보도록 해요!!

오늘은 여기까지~