ํ๊ฒฝ๋ถ_๋์งํธ๋์๊ด ์์ฅ์๋ฃ ๋ชฉ๋ก์ ๋ฐ์์ GridView ๋ก ํํํ ์ฑ ์
๋๋ค.
UI ๊ตฌํ
๋น๋๊ธฐ์ฒ๋ฆฌ
- async-await
- DispatchQueue
๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํํ๋ฉด |
์์ธํ๋ฉด |
|
|
- ๊ฐ๋จํ ํ๋ก์ ํธ๊ธฐ์ ์ํคํ
์ณ๋ฅผ ์ ์ฉํ์ง ์๊ณ , Model ๊ณผ View ๋ก๋ง ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค.
- ์ง์ ๋ง๋ ๋คํธ์ํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค. ์์ฃผ ์ฌ์ฉํ๋ ๋คํธ์ํน ์ฝ๋๋ฅผ ์ถ์ํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌํ ํ์ต๋๋ค.
async-await
์ผ๋ก ๋คํธ์ํฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋์ด์์ด, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ async-await
์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
โ
๋น๊ฒจ์ ๋ค์ ํ์ด์ง ๋ถ๋ฌ์ค๊ธฐ
- ๋ฐ์ดํฐ 20๊ฐ ์ฉ ํ์ด์ง์ ๊ตฌํํ๋ ๋ชฉ์ ์ด ์์์ต๋๋ค.
- ์คํฌ๋กค์ด ์คํฌ๋กค๋ทฐ ์ตํ๋จ์ ๋ฟ์ ์ํ์์, ์ฌ์ฉ์๊ฐ ๋ ์๋๋ฅผ ๋ณด๊ธฐ ์ํด ๋น๊ฒผ์ ๋๋ฅผ ์ธ์ํ๊ธฐ ์ํด
PreferenceKey
๋ฅผ ์ด์ฉํ์ฌ ScrollOffset ์ํ๋ฅผ ๊ตฌ๋
ํ์ต๋๋ค.
- ์ง์ ํ offSet ๊ฐ(100) ์ ๋๊ฒ ๋น๊ธฐ๋ฉด ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋๋ก ์ค์ ํ์ต๋๋ค.
.onPreferenceChange(ScrollOffsetKey.self) { value in
let atBottomValue = DeviceSize.height - CGFloat(160)
let scrollOffset = atBottomValue - value
if scrollOffset > 100 {
guard shouldFetchMoreBooks == false else { return }
shouldFetchMoreBooks = true
}
}
- ๋ง์ง๋ง ํ์ด์ง์ ๋๋ฌํ์ ๋, ์๋ฆผ์ ์ฃผ๊ธฐ ์ํด
ToastMessage
๋ฅผ ๊ตฌํํ์ต๋๋ค.
โ
Sticky Header
- ์ฌ์ฉ์์๊ฒ ์ต์ํ UI๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์์ธ๋ณด๊ธฐ์์
Sticky Header
๋ฅผ ๊ตฌํํ์ต๋๋ค.
- ๋ผ์ดํธ๋ชจ๋์ ๋คํฌ๋ชจ๋ ๋ ๋ชจ๋์์ ์๊ฐ์ฐจ์ด๋ฅผ ๋ณด์ด์ง ์๋๋ก
Semantic Color
๋ฅผ ์ด์ฉํ์ต๋๋ค.
ํํ๋ฉด |
์์ธํ๋ฉด |
|
|
๐ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋ค์์ฑ
- ์ฑ
ํ์ง ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒ์ ๋ํด์๋
PlaceholderImage
๋ฅผ ๋ง๋ค์ด ์ ์ฉ ํด์ฃผ์์ต๋๋ค.
- ์ฑ
ํ์ง ์ด๋ฏธ์ง๊ฐ ์์ด๋ ํฌ๊ธฐ๊ฐ ๋ค์ํด์ width ๊ฐ๋ง ํต์ผ ์์ผ์ฃผ๊ณ ์ต๋ ๋์ด๊ฐ์ ๋ง์ถฐ ์
๋์ด๋ฅผ ํ์ฑํ์ต๋๋ค.
๐ async๋ฉ์๋ ์ฌ์ฉ์ data-race ๋ฌธ์ ๋ฐ์
- ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ์ง์ ๊ฐ(100) ์ด์ ๋น๊ฒผ์ ๋, ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋๋ก ์ค์ ํ๋๋ฐ, 100์ ๋์ ์๊ฐ์ด ์ฌ๋ฌ๋ฒ ๋ฐํ ๋์ด ์๋ง์ ์์ฒญ์ด ๋์์ ๋ฐ์๋์ด ๋ค์ํ์ด์ง ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฐ์ ํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ค๋ณตํด์ ๋ถ๋ฌ์ค๋ ํ์์ด ์์์ต๋๋ค.
- ๋ฎคํ
์ค๋ฝ์ ์ญํ ์ ํด์ค
Bool
ํ์
๋ณ์๋ฅผ ์ด์ฉํด์ ํ๋ฒ์ ๋น๊น์ ํ๋ฒ์ ์์ฒญ๋ง ์ผ์ด๋๊ฒ ๋ง๋ค๊ณ , asyncAfter
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ Bool
ํ์
๋ณ์๋ 1์ด๋ค์ toggle()
์ด ๋๋๋ก ๋ง๋ค์ด ์ค๋ณต์์ฒญ์ ๋ง์์ฃผ์์ต๋๋ค.