๊ฐœ๋ฐœ ์‹œํ–‰์ฐฉ์˜ค

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ (Performing reloadData as a fallback — Invalid update)

Forest Yun 2023. 3. 1. 19:12
728x90

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป

CollectionView๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด cell ์‚ญ์ œ, ์ถ”๊ฐ€, ๋ณ€๊ฒฝ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋•Œ reloadData, reloadSection, deletedItem, insertItem ๋“ฑ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ด€๋ จํ•˜์—ฌ CollectionView์˜ ๋ ˆ์ด์•„์›ƒ์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

์œ ํšจํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ

[UICollectionView] Performing reloadData as a fallback — Invalid update: invalid number of items in section 0. ...

deleteItem ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด CollectionView๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค ํ•˜๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  collectionView์— ์–ด๋– ํ•œ ๋ณ€ํ™”๋„ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ž˜ ์ฝ์–ด๋ดค๋‹ค.

  • ํด๋ฐฑ์œผ๋กœ reloadData ์ˆ˜ํ–‰ -  ์œ ํšจํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ: ์„น์…˜ 0์˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜
  • ์—…๋ฐ์ดํŠธ ํ›„ ๊ธฐ์กด ์„น์…˜์˜ ์•„์ดํ…œ ์ˆ˜๋Š” ์—…๋ฐ์ดํŠธ ์ „ ํ•ด๋‹น ์„น์…˜์˜ ์•„์ดํ…œ ์ˆ˜์™€ ๊ฐ™์•„์•ผํ•œ๋‹ค. ๐Ÿ˜Ÿ

์—…๋ฐ์ดํŠธ ์ „ํ›„๋กœ ์„น์…˜์˜ ์•„์ดํ…œ ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š”๋ฐ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„์—๋„ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ„๋‹ค. ์–ด์จŒ๋“  ์˜ค๋ฅ˜๋ฉ”์„ธ์ง€๋Š” ์„น์…˜์˜ ์•„์ดํ…œ ์ˆ˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋Œ€์‹  reloadData๋ฅผ ์ˆ˜ํ–‰ํ•ด ๋‹ค์‹œ CollectionView๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

๋ฐ์ดํ„ฐ๋ฅผ UserDefaults์— ๋„ฃ์–ด ๊ด€๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ UserDefaults์˜ ๊ฐ’๋„ ๋‹ค ๋ณ€๊ฒฝํ•œ ํ›„ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ  ์—ฌ๊ธฐ์„œ ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

 

 

 

CollectionView๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค

CollectionView์˜ ์ƒ์„ฑ๋  ๋•Œ์—๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋“ค์ด ํ˜ธ์ถœ๋œ๋‹ค. ๋จผ์ € func numberOfSections(in: UICollectionView)์ด ํ˜ธ์ถœ๋˜์–ด ์„น์…˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ํ›„ ๊ฐ ์„น์…˜์˜ ์•„์ดํ…œ ์ˆ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด func collectionView(UICollectionView, numberOfItemsInSection: Int)๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์•„์ดํ…œ์˜ cell์„ ๊ตฌ์„ฑํ•˜๋Š” func collectionView(UICollectionView, cellForItemAt: IndexPath) ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. 

์—…๋ฐ์ดํŠธํ•  ๋•Œ๋„ ์–ด์จŒ๋“  collectionView๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ๊น ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์ด ๋™์ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. (deleteItem์˜ ๊ฒฝ์šฐ ๊ทธ์ € ํŠน์ • ์•„์ดํ…œ์„ ์ง€์šฐ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„์ดํ…œ์˜ cell์ด ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, cellForItemAt ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.) ๋”ฐ๋ผ์„œ ์œ„ ์„ธ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž˜ ๋ณด๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.(๊ตฌ๊ธ€๋ง๋„ ๋„์›€์ด ๋˜์—ˆ๋‹ค)

 

 

 

 

์‹ค์ˆ˜ ๋ฐœ๊ฒฌ!

 

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” UserDefaults์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ UserDefaults์˜ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋งŒ ์ƒ๊ฐํ–ˆ๋‹ค..

ํ•ด๋‹น ํ™”๋ฉด์„ ๋งŒ๋“ค๋ฉด์„œ ์„น์…˜์„ 2๊ฐœ๋กœ ๋‚˜๋ˆ  CollectionView๋ฅผ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด๋ฉฐ ์ง๊ด€์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋ณด์ด๊ธธ ๋ฐ”๋ผ UserDefaults์—์„œ ๊บผ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด Array ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ–ˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ณ€์ˆ˜๋กœ CollectionView๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. ๊ทผ๋ฐ ์ด Array ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•„์„œ ์•„์ดํ…œ ๊ฐœ์ˆ˜์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค๐Ÿ˜ซ

ํ•ด๋‹น Array ๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•˜๋‹ˆ ์•„์ฃผ ์ž˜ ์ž‘๋™ํ–ˆ๋‹คใ…Žใ…Ž

 

 

 

 

 

๋งˆ๋ฌด๋ฆฌ

์•ฝ๊ฐ„ ํ—ˆ๋ฌดํ•œ ๊ฒฐ๋ง์ด๋ผ ์ƒ๊ฐ์ด ๋์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•˜๋ฉด์„œ ์ด ์‹œํ–‰์ฐฉ์˜ค๋กœ ๋ฐฐ์šด ๋‚ด์šฉ์ด ๋งŽ๋‹ค๋Š” ๊ฑธ ๋Š๊ผˆ๋‹ค. ์˜ค๋ฅ˜ํ•ด๊ฒฐ์„ ์œ„ํ•ด ํ•œ ์ •๋ณด๋งŒ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ณต๋ถ€ํ•œ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋„์›€์ด ๋  ๋งŒํ•œ ์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๋„ ์–ป๊ณ  ์‚ฌ์šฉํ•ด๋ณด์ง€ ์•Š์•˜๋˜ ๋ฉ”์„œ๋“œ๋“ค๋„ ์ ‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์—ญ์‹œ ์˜๋ฏธ์—†๋Š” ๊ณต๋ถ€๋Š” ์—†๋‹ค.

  • deleteItem, insertItem ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด reloadData๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • deleteItem์€ ์ฝ”๋“œ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด insetItem๋ณด๋‹ค ๋จผ์ € ์ž‘๋™๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•„์ดํ…œ ๋ณ€ํ™”๋ฅผ ๋™์‹œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ performBatchUpdates(_:completion:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.
  • CollectionView ์—…๋ฐ์ดํŠธ๋Š” ์ƒˆ CollectionView ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • ํŠนํžˆ reloadData๋Š” ์•„์ดํ…œ์˜ cell๊นŒ์ง€ ๋ชจ๋‘ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด UI ๊ตฌ์„ฑ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • item์„ delete, insert, move ํ•˜๋Š” ๊ฒƒ์€ cell์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  • ์„œ๋ฒ„์—์„œ ์„น์…˜ ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ reloadSection๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋˜๊ณ  reloadData๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • CollectionView๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Array๋ฅผ ์ž˜ ๋ณด์ž๐Ÿงš๐Ÿป‍โ™€๏ธ
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์žกํ•˜์ง€ ์•Š๊ฒŒ ๊ตฌ์„ฑํ•˜์ž.

ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์  ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด์„œ ํšจ์œจ๊ณผ ๊น”๋”ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์ง€ ์•Š์„ ์ˆ˜ ์—†๋‹ค.. 

UserDefaults๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ UserDefaults์— ์ €์žฅํ•˜๋Š” ๊ฑด ์‚ฌ์‹ค ๊ทธ ํด๋ž˜์Šค ๋ชฉ์ ์— ๋งž์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ Core Data๋กœ ์˜ฎ๊ธธ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด์™€ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋„ ์ •๋ฆฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

728x90