์ฐ๋ฆฌ๊ฐ ์ปฌ๋ ์
๋ทฐ, ํ
์ด๋ธ ๋ทฐ๋ฅผ ์ฌ์ฉ ํ ๋ ์
์ ์ฌ์ฌ์ฉํ๋๋ฐ, ๊ทธ๋ cell์ ํ์๋์ด์ผ ํ๋ ๋ด์ฉ์ด ์๋ชป๋์ด ๋์ค๊ฑฐ๋ ๋ฒ๋ฒ
์ด๋ ๋ฏํ ํ์์ ๋ณด์ด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์๊ฒ์ด๋ค.
์ด ํ์์ ์ดํดํ๊ธฐ ์ํด์๋ cell์ด ์ด๋ป๊ฒ ์ฌ์ฌ์ฉ๋๋์ง ์๊ณ ์์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์์ ํด๊ฒฐํ ์ ์๋ ์์ ์ด prepareForReuse
ํธ์ถ ์์ ์ด๋ค.
prepareForReuse
์์ฒด์ ์ ์๋ ๊ฐ๋จํ๋ค. ๋ง ๊ทธ๋๋ก ์ฌ์ฌ์ฉ์ ๋ํ ์ค๋น๋ฅผ ํ๋ ์ญํ ์ ์ํํ๋ค.
์ ์ฌ์ฌ์ฉ์ ํ๋์ง์ ๋ํด์๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ค์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด ์ข์๊ฒ์ด๋ค.
cell์ ์ฌ์ฌ์ฉ์ ์ํด ์ฐ๋ฆฌ๋ ์๋์ ๊ฐ์ด tableView, collectionView์์ dequeueReusableCell(withIdentifier: )
๋ฅผ ์ฌ์ฉํ๋ค.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: TestCell.identifier, for: indexPath) as? TestCell else {
fatalError("Cell Not Found")
}
// ...
return cell
}
์ฌ์ฌ์ฉ์ ๋ํ ๊ณผ์ ์ ์์๋ณด๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ dequeueReusableCell(withIdentifier: )
๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด๋ คํ๋ค.
dequeueReusableCell(withIdentifier: )
์ ์ด๋ฆ์ ์ฒ์ฒํ ์ดํด๋ณด๋ฉด dequeue
, Reuse
, Cell
์ด๋ ๊ฒ ์ธ๊ฐ์ง๋ก ๋๋ ๋ณผ ์ ์๋ค.
ํ
์ด๋ธ ๋ทฐ๋ ์ปฌ๋ ์
๋ทฐ ๋ชจ๋ ์
์ ์ฌ์ฌ์ฉ(Reuse)ํ๋๋ฐ, ์
๋ค์ ์ฌ์ฌ์ฉ ๊ตฌ์กฐ๋ ํ(queue)๋ก ๋์ด์๋ค. ๊ทธ๋์ dequeue
๋ผ๋ ๋จ์ด๊ฐ ๋ฑ์ฅํ๋ค.
์ ์ฌ์ง์ ์ฐ๋ฆฌ๊ฐ ์์๋ณผ ๊ณผ์ ์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ธ ์ฌ์ง์ด๋ค. ์ฌ์ง ์ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ดํด๋ณด๋ฉด ์ฌ์ฉ์์๊ฒ ํ์๋๋ ์
๋ค์ด ์๊ณ ์คํฌ๋กค์ด ๋์ด ํ๋ฉด์์ ๋ณด์ด์ง ์๋ ์
๋ค์ด ์๋ค.
์คํฌ๋ฆฐ์ ํ์๋๊ณ ์์ง ์๋ cell๋ค์ queue๋ก ๋ค์ด๊ฐ๋ค.(์ฌ์ง์์๋ Task 2 ์
์ ์๋ก ๋ค๊ณ ์๋ค.) ์ด๋ ๊ฒ queue๋ก ๋ค์ด๊ฐ cell๋ค์ dequeueํ์ฌ reuse๋๋ ๊ณผ์ ์ด ์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ cellForRowAt
๋ฉ์๋์์ dequeueReusableCell(withIdentifier: )
์ ํตํด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ด๋ค.
์์ ๊ฐ์ ๊ณผ์ ์ ์๊ณ ๋๋ฉด ์ cell ์ฌ์ฌ์ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ ์ถํ ์ ์์ ๊ฒ์ด๋ค.
์คํฌ๋ฆฐ์ ํ์๋๊ณ ์์ง ์์ cell๋ค์ด queue๋ก ๋ค์ด๊ฐ๋ค๊ณ ํ๋ค. ๋ฐ๋ผ์ ๊ทธ๊ฑธ ๊ทธ๋๋ก dequeueํ์ฌ ์ฌ์ฌ์ฉํ ๊ฒฝ์ฐ ํํ๋ค ํ๋ฒ์ฏค ๊ฒช๋ ์ฌ์ฌ์ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
(์ ์ฌ์ง์์๋ Task 2 cell์ด ์ฒดํฌ๋ ์ํ๋ก queue์ ๋ค์ด๊ฐ๊ณ , ์ด๋ฅผ dequeueํ์ฌ ์ฌ์ฌ์ฉ์ ํ ๊ฒฝ์ฐ ์ฒดํฌ๋ ์ํ์ cell์ด ๋์ฌ ๊ฒ์ด๋ค.)
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด prepareForReuse
๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ฌ์ง์ ๋ช
์๋ ์์๋ก cell์ด ์ฌ์ฌ์ฉ๋๋๋ฐ cellForRowAt
์ด ํธ์ถ ๋๊ธฐ ์ prepareForReuse
๊ฐ ํธ์ถ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ prepareForReuse๋ด๋ถ์ cell์ด ์ฌ์ฌ์ฉ๋๊ธฐ ์ํ ์ด๊ธฐ ์ค์ ์ ์ฝ๋ฉ ํด์ค๋ค.
override func prepareForReuse() {
super.prepareForReuse()
// ...
}
ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ ์ด๋ค ์ํ๋ฅผ ์ ์งํด์ผํ๋ cell์ด ์๋ ๊ฒฝ์ฐ์ด๋ค.
๋ง์ฝ cell์์ฒด์ ์ธํฐ๋์ ์ด ์๊ณ ๊ทธ๋ฅ ํ์๋๋ ์ฉ๋๋ผ๋ฉด ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์์์ฒ๋ผ cell์ ํฐ์นํ์ ๋ ์ฒดํฌํ์๊ฐ ๋๋ ๊ฒฝ์ฐ, prepareForReuse์์ label์ text์ ์ฒดํฌํ์์ ๋ํ ์ด๊ธฐํ๋ฅผ ์์ผ์ค๋ค๋ฉด ์ด๋ฏธ ํฐ์น๋์ด ์ฒดํฌํ์๊ฐ ๋์ด์์ด์ผํ๋ cell์ ์คํฌ๋กค๋ก ์ธํด ํ๋ฉด์์ ์ฌ๋ผ์ก๋ค๊ฐ ๋ค์ ํ์๋๋ ๊ฒฝ์ฐ ์ฒดํฌํ์๊ฐ ์ฌ๋ผ์ ธ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์์ ๊ฐ์ ๋ถ๋ถ์ ์ฃผ์ํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค. ์ธ๊ธํ ์์์์๋ prepareForReuse ์ดํ ํธ์ถ๋๋ cellForRowAt์์ ๋ฐ์ดํฐ์์ค๋ฅผ ์ฒดํฌํ์ฌ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.