โ๏ธ ํ๊ฒฝ
- iOS 16์ด์
- Swift 5.9
- Xcode 15
๐ป ๋ฌธ์ ์ํฉ
- ๊ฐ์ธ์ฑ ํ๋ก์ ํธ ์งํ ์ค diffableDatasource๋ก ์ปฌ๋ ์
๋ทฐ ํ์ฉํ๋ UI๋ฅผ ์ฌ์ฉ ์ค์ด์๊ณ , Realm์์ create๋ ์ ๋๋๋ฐ delete๋ฅผ ํ๋ ค๊ณ ํ๋ฉด delete ํ์
์ฐฝ์์ ์ฑ์ด ํฐ์ง๋ฉฐ 'object has been deleted or invalidate'๋ผ๋ ์ค๋ฅ๊ฐ CollectionView๊ฐ ์๋ VC์ snapshot์ ์ฐ๋ ๋ถ๋ถ์์ ๋ฌ๋ค.
- '์ด๋ฏธ ์ญ์ ๋ ๊ฐ์ฒด์ธ๋ฐ ์ ์ ๊ทผํด?' ์๋ฏธ์ ์ค๋ฅ์๋๋ฐ, ๊ฐ์ฒด๊ฐ ํ ๊ฐ์ผ ๋ ๋ฌธ์ ์์ด ๊ตฌํ์ด ๋์์ผ๋ ๋ ๊ฐ ์ด์๋ถํฐ๋ ์ญ์ ์ ์์ ๊ฐ์ ์ค๋ฅ ๋จ๋ฉฐ ์ฑ์ด ๋ฉ์ท๋ค.
โ๏ธํด๊ฒฐ๋ฐฉ์
- ์ฒ์์ realm๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ธ ์ค ์๊ณ realm์ ์ฌ์ฉํ ์ฝ๋๋ฅผ ๋ชจ๋ ํ์ธํด๋ณด์์ผ๋, (1) ์ญ์ ํ ๋ ์ค๋ฅ๊ฐ ๋๋ฉฐ ์ฑ์ด ๋ฉ์ถค์๋ ๋ถ๊ตฌํ๊ณ ๋ ์์๋ ์ญ์ ๋ฉ์๋๋ฅผ ์คํํ ์
๋ฐ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ณ ์์๊ณ (2) print๋ฅผ ์ฐ์ด์ ํ์ธํ์ ๋๋ ๋ฉ์๋์ ๋ฌธ์ ์์์ ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋ด ์์๊ณผ ๋ฌ๋ฆฌ realm์ ๋ฌธ์ ๊ฐ ์๋์๋ค.
- ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ์๋ฉด diffableDatasource๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ์ฐํ๊ณ ์์๊ธฐ ๋๋ฌธ์ diffableDatasource ์ค ์
๋ฐ์ดํธ(apply)๋ฅผ ํด์ฃผ๋ ๋ถ๋ถ์ ๋ฌธ์ ์๋ค. diffableDatasource๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ reloadData์ ์ญํ ์ snapshot์ด ๋์ ํ๋๋ฐ apply์ ์ข
๋ฅ ๋ฌธ์ ์๋ค๋ ๊ฑธ ํด๋น ๋ฌธ์ ๋ก ์ผ์ฃผ์ผ๋์ ์๋ค๊ฐ ๋ฉํ ๋์ ํด๊ฒฐ๋ฐฉ์์ ๋ณด๋ฉฐ ๋ฐฐ์ฐ๊ฒ ๋์๋ค. ์ค๋ฅ๊ฐ ์ฐํ๋ ๋ถ๋ถ๋ ๋ฑ ์
์ ๊ฐ์๋ฅผ ์ญ์ ์ดํ์ ๊ฐ์๋ก ์
๋ฐ์ดํธ ํด์ฃผ๋ ๋ฉ์๋๋ก ์ด์ด์ง ๋ ์ฑ์ด ํฐ์ก๊ธฐ ๋๋ฌธ์ ์์ ํ apply์ ์ฌ์ฉ์ด ๋ฌธ์ ๊ฐ ๋ง์๋ค.
- ๋ด๊ฐ diffableDatasource๋ฅผ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ฒ ๋ ๊ณ๊ธฐ๋ diffableDatasource์ animation ํจ๊ณผ ๋๋ฌธ์ด์๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ฐ๋ apply (animationDifferences: True)๋ฅผ ์ฌ์ฉํ ์ค๋
์ท์ ์๋ก ์
๋ฐ์ดํธ ๋๊ธฐ ์ ์
์์น๋ฅผ ๊ธฐ์ตํ๊ณ , ๊ทธ ์์น์์ ์
๋ฐ์ดํธ๋ฅผ ํด์ค๋ค. ๊ทธ๋์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํด๋ฒ๋ฆฌ๋ฉด ์ค๋
์ท์๋ ์ฌ์ ํ ํด๋น ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋๋ฐ ์ค์ ๋ก๋ ์ญ์ ๋์๊ธฐ ๋๋ฌธ์ 'object has been deleted or invalidate'๋ผ๋ ์ค๋ฅ๊ฐ ๋จ๊ณ ์์๋ ๊ฒ. ๋ง๊ทธ๋๋ก ์ญ์ ๋ ๊ฐ์ฒด์ ์ค๋
์ท์ ๊ทธ ๊ฐ์ฒด๋ฅผ ์
๋ฐ์ดํธ ํด์ฃผ๋ ค๊ณ ์ ๊ทผํ๊ณ ์๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฑฐ๋ค.
- ์์ ํ ์ฝ๋:
- apply์ ์ข
๋ฅ ์ค applySnapshotUsingReloadData ๋ผ๋ ๊ฒ ์์๋ค. apply(snapshot) ๋ถ๋ถ์ applySnapshotUsingReloadData(snapshot)์ผ๋ก ์์ ํ์, ์ ๊ทผ ๊ด๋ จ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์๋ค!
- applySnapshotUsingReloadData์ ๋ํ์ฌ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํด๋ณด์๋ค. ๋ฌธ์์๋ Resets the UI to reflect the state of the data in the snapshot without computing a diff or animating the changes. ๋ผ๊ณ ์ ์๋ฅผ ํด์ฃผ๊ณ ์๋๋ฐ, applySnapshotUsingReloadData ๋ฉ์๋๋ current state๊ณผ new state์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ animating ๋ณํ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ์ค๋
์ท์ ๋ฐ์ดํฐ ์ํ๋ฅผ UI์ ๋ฐ์ํด์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค๋
์ท์ ์ด์ ์ ๊ธฐ์ตํ๊ณ ์์๋ ๊ฐ์ฒด์ ๊ณ์ฐ์ ํ๊ธฐ ์ํด ์ ๊ทผํ๋ คํ์ง ์๊ณ ๋ฐ๋ก ์
๋ฐ์ดํธ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํด์ค ์ ์๊ฒ ๋ ๊ฒ.
๐งนDiffableDatasource + Snapshot + apply ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ
* ๋ชจ๋ ์ ํ ๊ณต์ ๋ฌธ์ ๋ด์ฉ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌํจ.
* DiffableDatasource: The object you use to manage data and provide cells for a collection view.
- DiffableDatasource๋ ์ปฌ๋ ์ ๋ทฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ด๋ จ UI๋ฅผ ๋ณํ๋ฅผ ์ค์ค๋ก ์ถ์ ํด์ ์ ๋ฐ์ดํธ ํ๋ค.
- Hashable Value๋ก ๋ฐ์ดํฐ์ ์ํ๋ฅผ ํ์ธํ์ฌ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ถ์ ํ๋ค. (CollectionView๋ TableView๋ฅผ ๊ทธ๋ฆด ๋ ๋๊ตฌ๋ ํ๋ฒ์ฏค์ out of index ์ค๋ฅ๋ฅผ ๋ง๋๋ดค์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ผ์ ๋ฐฉ์งํ ์ ์์! )
* Snapshot: a representation of the current state of the data in the colleciton view
- Snapshot์ ์ปฌ๋ ์ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋ UI๊ฐ Truth์ธ ๋ฐ์ดํฐ์ ํ์ฌ์ํ๋ฅผ ๋ํ๋ด๋ ์ญํ ์ ํ๋ค. Truthํ์ง ์๋ค๋ ๊ฑด ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋์ด์ ์ ํจํ์ง ์๊ฑฐ๋, ๋น์ด์์์ ์๋ฏธํ๋ค.
* apply
- apply ์ฝ๋๊ฐ ๋ ๊ฐ๊ฐ ์๋๋ฐ, ํ๋๋ iOS 13์ ๋ฑ์ฅ ๋ฉ์๋, ๋ค๋ฅธ ํ๋๋ iOS 15์ ๋ฑ์ฅํ ๋ฉ์๋์ด๋ค.
- reloadData์ ๊ฐ์ ์ญํ ์ ํ๋๋ฐ, iOS13์ ๋ฑ์ฅํ apply๋ animatingDiffrence๊ฐ true์ผ ๋๋ง diff ์ ๋ฐ์ดํธ, false ์ผ ๋๋ฉด reloadData ์ํ ||| iOS15์ ๋ฑ์ฅํ apply๋ animatingDiffrence์ ์๊ด์์ด ํญ์ diff๋ง ์ ๋ฐ์ดํธ๋ฅผ ํด์ค๋ค....์ธ๋ฐ ๋๋ฌด ์ด๋ ต๋ค.๊ทธ๋ฐ๋ฐ animation์ค์ ์ ์๊ฐํ๋ฉด iOS15์ ๋ฑ์ฅํ apply๋ฅผ ์ฐ๋๊ฒ ์ข์ง ์๋.
* applySnapshotUsingReloadData
- current state๊ณผ new state์ ์ฐจ์ด(diff)๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ animating ๋ณํ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ์ค๋ ์ท์ ๋ฐ์ดํฐ ์ํ๋ฅผ UI์ ๋ฐ์ํด์ฃผ๋ ๋ฉ์๋. ์กฐ๊ธ ๋ reload์ ์ด์ ์ ๋ง์ถ ๊ฒ ๊ฐ๋ค.
'๐ Dev > Issue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Error] Library not loaded: @rpath no such file (0) | 2023.11.13 |
---|---|
[Error] Could not get GOOGLE_APP_ID in Google Services file from build environme (0) | 2023.11.10 |
[Issue] Assets์ ์ค์๋ก ์ญ์ ํ๋ค๋ฉด? (0) | 2023.08.22 |
[Error] Could not insert new outlet connection (2) | 2023.08.16 |
[Issue/UIKit] TableViewCell์ ์ถ๊ฐํ ๋ฒํผ ๊ตฌ๋ณํ๊ธฐ (0) | 2023.08.06 |