<h1><center> Advances in diffable data sources </center></h1> ###### tags: `๐ป WWDC ์คํฐ๋` > [color=#724cd1][name=๋ฐ๋ฆญ] > [Advances in diffable data sources - wwdc](https://developer.apple.com/videos/play/wwdc2020/10045/) > WWDC 2020 Session ์ค ํ๋์ธ `Advances in diffable data sources`์ ๋ํด ์์๋ณด์ # ๊ฐ์ > Diffable Data Source์ ๋ํ ๊น์ ํ์ต์ด ํ์ํ๋ค.  - ์ฒซ ๋ฒ์งธ ์น์ ์ Horizontally scrolling grid์ด๋ค. - ์ค๊ฐ์ ์น์ ์ iOS 14๋ถํฐ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ธ๋ฐ, ํ์ฅ ๋ฐ ์ถ์๊ฐ ๊ฐ๋ฅํ outline-styled UI๋ผ๊ณ ํ๋ค. - ๋ง์ง๋ง ์น์ ์ UITableView์ฒ๋ผ ๋ณด์ด๋ UICollectionView์ด๋ค. iOS 13์ ๋์ ๋ Diffable Data Source๋ ์๋ก์ด snapshot ๋ฐ์ดํฐ ํ์ ์ผ๋ก UI ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค์๋ค. ### Snapshot ์ค๋ ์ท์ ๊ณ ์ ํ ์น์ ์ ๊ฐ์ง๊ณ item์ identifier๋ฅผ ์ฌ์ฉํ์ฌ UI State๋ฅผ ์บก์ํํ๋ค. ๋ฐ๋ผ์, UICollectionView๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋จผ์ ์๋ก์ด ์ค๋ ์ท์ ๋ง๋ค๊ณ ํ์ฌ ๋ณด์ฌ์ง๋ UI์ State๋ฅผ ์ฑ์ด ๋ค์ Data Source์ ์ ์ฉํ๋ค. Diffable Data Source๋ ์ถ๊ฐ ์์ ์์ด ์๋์ผ๋ก ๋ฐ์ดํฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๊ณ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ค. **WWDC 2019 Advances in UI Data Source**์์ ์ด API๋ฅผ ์์ธํ ๋ค๋ฃจ๊ณ ์๋ค๊ณ ํ๋ค. ๋ค์ ์ฃผ์ ๊ณต๋ถํด๋ณด๊ฒ ๋ค. ๊ทธ๋์ iOS 14๋ถํฐ ์ ์ฉ๋๊ฒ ๋ฌด์์ด๋๋ฉด, ์น์ ์ค๋ ์ท๊ณผ first class Reordering(์ต๊ณ ์์ค์ ์ฌ์ ๋ ฌ..?) ์ง์์ด๋ผ๋ ๋ ๊ฐ์ง ์๋ก์ด ๊ธฐ๋ฅ์ด ๊ตฌ์ถ๋์๋ค๊ณ ํ๋ค. ## Section Snapshot ์์์ iOS 14์ ๊ฒฝ์ฐ, Section Snapshot์ด๋ผ๊ณ ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค๊ณ ์ธ๊ธํ๋๋ฐ.. Section Snapshot์ ๊ธฐ์กด ์ค๋ ์ท ๋ฐ๋ก ์์ ์๋ก์ด ์น์ ์ค๋ ์ท์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค. UICollectionView์ single snapshot์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๋ค. (์ด๋ฆ์์ ์ ์ ์๋ค๋ ํํ์ด ์๋๋ฐ.. ๋๋ ํ๊ตญ์ธ์ด๋ผ ์๊ธฐ ํ๋ค๋ค.) ์ด๋ ๊ฒ ํฅ์ ๋ ์ด์ ๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. 1. Data Source๋ฅผ section-sized chunk๋ก ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค๊ณ ํ๋ค. 2. iOS 14์ UI ๋ ๋๋ง์ ์ง์ํ๋ ๋ฐ ํ์ํ ๊ณ์ธต์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ํ์ฉํ๊ฒ ๋๋ค. - ๋ฌด์จ๋ง์ผ๊น? - ๊ณ์ธต์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ค.  ์ฒซ ๋ฒ์งธ Horizontally scrolling Section์ ๋ณด๋ฉด single section snapshot์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ๋ง์ ํ๋ค. ๋ ๋ฒ์งธ๋ ํ์ฅ ๋ฌ๋ค๊ฐ ์ถ์๋ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ ์น์ ์ธ๋ฐ ๋ ๋ฒ์งธ ์น์ ์ค๋ ์ท์ ์ฌ์ฉํ์ฌ ์ด ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ๋ง ํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋๊น ์ด ๋ง์ extendable ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด์ง ์์๊น? ```swift enum Section { case horizontal case extendable case list } ``` ์์ฝํ์๋ฉด ๊ฐ๊ฐ์ ๋จ์ผ ์น์ ์ ๋ํ๋ด๋ ์ด ์ธ ๊ฐ์ ์น์ ์ค๋ ์ท์ผ๋ก Diffable Data Source๋ฅผ ๊ตฌ์ฑํ๋ค.  > Section Snapshot API ์น์ ์ค๋ ์ท์ ํ์ ์ ์ดํด๋ณด๋ฉด item ํ์ ์ด Generic์ธ ๊ฒ์ ์ ์ ์๋ค. Section์ Identifier ํ์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์. Section Snapshot์ ๋ณธ์ง์ ์ผ๋ก ์์ ์ด ์ด๋ค ์น์ ์ ๋ํ๋ด๋์ง ์ ์ ์๋ค๊ณ ํ๋ค. Section snapshot์ ์ถ๊ฐํ๊ธฐ ์ํด์ `append`๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋งค๊ฐ๋ณ์ **parent**๋ฅผ ์ ์ฌํ ๋ด์ผํ๋ค. parent๋ฅผ ํตํด ์น์ ์ค๋ ์ท์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์-ํ์ ๊ด๊ณ๋ก ์์ฑํ ์ ์๋ค. ๋ง์ฝ parent ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํด๋น Item์ Root๋ก ์ ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค.  ๋, ์๋ก์ด ์น์ ์ค๋ ์ท์ ์ํด ๋ ๊ฐ์ ์๋ก์ด API๋ฅผ ์ถ๊ฐํ๋๋ฐ apply ๋ฉ์๋๋ ์น์ ์ค๋ ์ท๊ณผ identifier๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์์ด๋ค. snapshot ๋ฉ์๋๋ ํน์ ์น์ ์ ์ฝํ ์ธ ๋ฅผ ๋ํ๋ด๋ ์น์ ์ค๋ ์ท์ ๊ฒ์ํ ์ ์๋ค๊ณ ํ๋ค.  > ์ค๋ ์ท ๊ตฌํ  ์ฝ๋์์ parent๋ฅผ ์ค์ ํ์ฌ ์์-ํ์ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค. ### Child snapshot  ์ด ์ฝ๋๋ Optional๋ก ์์ Item์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์์ Item๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ํ์ Item์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ### Expanding and collapsing items  Expansion State๋ ์น์ ์ค๋ ์ท State์ ์ผ๋ถ๋ก ๊ด๋ฆฌ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ํ ์ค๋ ์ท์ ์์ฑํ ๋ ํด๋น Item์ ์์ Expansion State๋ฅผ ์ค์ ํ์ฌ ํ์ ์ฝํ ์ธ ๊ฐ ์ฒ์์ ๋ณด์ฌ์ง์ง๋ฅผ ์ฝ๊ฒ ๊ฒฐ์ ํ ์ ์๋ค. ๋ํ, ์ค๋ ์ท์ queryํ์ฌ ํ์ฅ, ์ถ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ ์ค๋ ์ท์ Expansion State๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, ์ค์ Diffable Data Source์ ์ ์ฉํ ๋๊น์ง ์ ์ฉ๋์ง ์๋๋ค๊ณ ํ๋ค. ๋ง์ฝ ์ฌ์ฉ์๊ฐ outline disclosure ์ ์ธ์๋ฆฌ ๊ฐ์ outline-styled UI์ ์ํธ ์์ฉํ ๋ ํ๋ ์์ํฌ๋ ์๋์ผ๋ก ์ค๋ ์ท์ ์๋ก์ด Expansion State๋ก ์ ๋ฐ์ดํธํ๊ณ ํด๋น ์น์ ์ค๋ ์ท์ Data Source์ ์ ์ฉํ๋ค. ์ด๋ฐ ํ์ฅ ์ํ ๋ณ๊ฒฝ์ ๋ํ ์๋ฆผ์ ๋ฐ๋ ๊ฒ์ด ์ ์ฉ(?)ํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์์ Item์ด ์ ๋ ์ถ์๋์ง ์๋๋ก ์๊ตฌํ๋ ๋์์ธ์ด ์์ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ ์๋ก์ด API๋ฅผ ํตํด code ๋ฐฉ์์ผ๋ก ์ ์ดํ ์ ์๋ค๊ณ ํ๋ค.  ์ด๋ง.. ์ด๊ฒ ๊ทธ API์ด๋ค. ์์์ ๋งํ ์์ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ `shouldCollapseItem`์ ์ฌ์ฉํ์ฌ ํน์ ์์ Item์ ๋ํด false๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ Lazy Loading๋ ์ง์ํ๋๋ฐ snapshotForExpandingParent๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ## Reordering Support ๊ณ ์ ํ Item identifier๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ ์์ํฌ๊ฐ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ ๋ ฌํ ๋ณ๊ฒฝ ์ฌํญ๋ค์ ์๋์ผ๋ก ์ปค๋ฐํ ์ ์๋ค. ๊ทผ๋ฐ ๋ ๋ ๋์๊ฐ ๊ธฐ์ ..? ### Optional closures  `canReorderItem` ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ Reordering์ ํ์ฑํ ์ํฌ ์ ์๋ค. ํด๋ก์ ๋ด๋ถ์์ true๊ฐ ๋ฐํ๋๋ฉด Reordering ์ํธ์์ฉ์ด ์์๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ Reordering ์ํธ์์ฉ์ ๋ง์น๋ฉด didReorder ํด๋ก์ ๊ฐ ํธ์ถ๋์ด ์๋ก์ด ์ ๋ ฌ State๋ฅผ ์ฑ์ source of truth์ ์ปค๋ฐํ ์ ์๋ค๊ณ ํ๋ค. ์์ ์ธ๊ธํ canReorderItem์ didReorder ํด๋ก์ ๋ฅผ ๋ชจ๋ ์ ๊ณตํด์ผ Reordering ๊ธฐ๋ฅ์ ํ์ฑํ ์ํฌ ์ ์๋ค๊ณ ํ๋ค.(๋ฏธ๋ฆฌ ๋งํด์ฃผ์ง..) Transaction์ Diffable Data Source๋ฅผ ์ ๋ฐ์ดํธํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.  ใ ใ .. **initailSnapshot**์ ์ ๋ฐ์ดํธ๊ฐ ์ ์ฉ๋๊ธฐ ์ ์ Diffable DataSource์ State๋ผ๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ **finalSnapshot**์ ์ ๋ฐ์ดํธ๊ฐ ์ ์ฉ๋ ํ์ State์ด๋ค. ์ค๋ ์ท์ identifier๋ก App์ source of truth์ ์ปค๋ฐํด์ผํ๋ ์๋ก์ด ordering์ ๊ฒฐ์ ํ ์ ์๋ค. 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up