- ๊ฐ์ธํ๋ก์ ํธ
- 24.04.12 ~ 24.05.23
- ์ํ ๋๋ TV ์๋ฆฌ์ฆ๋ฅผ ๊ฒ์ํ๊ณ ํ๊ฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
SwiftUI
,TCA
Combine
,async/await
Chart
,Realm
,Alamofire
,Kingfisher
,AxisRatingBar
TMDB API
SwiftUI
๋ฅผ ํ์ฉํ์ฌ ํ๋ก์ ํธ ๊ตฌ์ฑTCA
์ํคํ ์ณ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ๋ฐฉํฅ ํ๋ฆ ๊ตฌํ- ์ํ ๊ฒ์ ๋ฐ ์ํ ๋ณ ๋ณ์ ์ ์ฅ ๊ตฌํ
- ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ค๋ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์ผ์ ๋ผ์ธ ์ ์ดํ๋ฉด ์ ๋ฌธ์ ๋ณด์ฌ์ค๋ ๋์ง๋ง ๋ผ์ธ ์๊ฐ ๋ง์์ง๊ฒ ๋๋ฉด ๋๋ณด๊ธฐ ๋ฒํผ์ ์ฝ์ ํ๋ ค๊ณ ํ์์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ์์ ๊ฒฝ์ฐ ๋ผ์ธ ์๋ฅผ ์์๋ด๊ธฐ๊ฐ ์ด๋ ค์
- iOS 16.0๋ถํฐ ์ฌ์ฉํ ์ ์๋
ViewThatFits
๋ฅผ ํ์ฉํ์ฌ ๊ธฐ์ค ๋ผ์ธ ์๋ฅผ ๋์ด๊ฐ ํ๋ฉด์ด ์๋ฆฌ๊ฒ ๋๋ฉด ๋๋ณด๊ธฐ ๋ฒํผ์ ์ฝ์ ํ๋๋ก ๊ตฌํ
// TruncatedTextView.swift
private func calculateTruncation() -> some View {
ViewThatFits(in: .vertical) {
Text(text)
.font(Constants.FontStyle.caption.style)
.hidden()
.onAppear {
guard isTruncated == nil else { return }
isTruncated = false
}
Color.clear
.hidden()
.onAppear {
guard isTruncated == nil else { return }
isTruncated = true
}
}
}
โก๏ธ ํธ๋ฌ๋ธ ์ํ
์์ธํ ๋ณด๊ธฐ
onAppear()
์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ตฌํํ์๋๋ฐ, ํญ ์ด๋ ํ์๋ ์ฌ๋ฌ๋ฒ ํธ์ถ๋์ด ๋ถํ์ํ ๋คํธ์ํฌ ํต์ ์ ์ํํ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์- UIKit์ viewDidLoad()์ ๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ์ ํ์์ฑ์ ๋๋
- ์์ ๋ทฐ์์ ํด๋น ํ๋ฉด์ onAppear() ํธ์ถ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๊ณ , @Binding์ ํตํด onAppear() ์ต์ด ํธ์ถ ์ฌ๋ถ์ ๋ฐ๋ผ ๋คํธ์ํฌ ํต์ ์ํ
struct MovieListView: View {
ย ย @Binding var viewLoaded: Bool
ย ย init(viewLoaded: Binding<Bool>) {
ย ย ย ย self._viewLoaded = Binding(projectedValue: viewLoaded)
ย ย }
ย ย var body: some View {
ย ย ย ย WithPerceptionTracking {
ย ย ย ย ย ย ScrollView(.vertical) {
...
ย ย ย ย ย ย }
ย ย ย ย ย ย .task {
ย ย ย ย ย ย ย ย if !viewLoaded {
ย ย ย ย ย ย ย ย ย ย viewLoaded = true
ย ย ย ย ย ย ย ย ย ย store.send(.viewDidLoad) // ๋คํธ์ํฌ ํต์ ์์ฒญ
ย ย ย ย ย ย ย ย }
ย ย ย ย ย ย }
ย ย ย ย }
ย ย }
}
- ์๋จ์ ํญ์ ํตํด ์ํ ํธ๋ ๋์ TV ์๋ฆฌ์ฆ ํธ๋ ๋๋ฅผ ๋๋์ด ๋ณผ ์ ์๋ค.
- ์ ํํ ์ํ์ ํฌ์คํฐ์ ์ค๊ฑฐ๋ฆฌ, ๋ฐฐ์ฐ์ ์คํญ ๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
- ์์ฒญํ ์ํ์ด๋ผ๋ฉด ๋ณ์ ์ ๋ฉ๊ธธ ์ ์๋ค.
- ์์ง ๋ณด์ง ์์์ ์ฐํด๋๊ณ ์ถ์ ์ํ์ด๋ผ๋ฉด ์๋จ ๋ฒํผ์ผ๋ก ์ ์ฅํ ์ ์๋ค.
- ์ํ๋ ์ํ์ ํค์๋๋ฅผ ํตํด ๊ฒ์ํ์ฌ ์ํ ๋๋ TV ์๋ฆฌ์ฆ๋ฅผ ํํฐ๋ง ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
- ๋ณด๊ณ ์ถ์ ์ํ๊ณผ ํ๊ฐ ์ํ ๋ฆฌ์คํธ๋ฅผ ๋ณผ ์ ์๋ค.
- ๋ง๋ ์ฐจํธ๋ฅผ ํตํด ๋์ ํ์ ๋ถํฌ๋ฅผ ํ์ ํ ์ ์๋ค.
- ํ๊ฐ ์ํ ๋ฆฌ์คํธ๋ ํ์ ๋์ ์ ๋๋ ๋ฎ์ ์์ผ๋ก ํํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
- SwiftUI์ ๋ํ ํ์ต์ ์ํด ์์ํ ํ๋ก์ ํธ๋ผ์ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง๊ฒ ๋์๋ค. ๋ ์ด์์ ๊ตฌ์ฑ์ ๊ฐ์ ์ก๊ณ ์ฌ๋ฌ ๊ธฐ์ ๋ค์ ์๋ํด๋ณด์๊ธฐ์ ๋๋ ธ์ง๋ง ์๋ฏธ์๋ ํ๋ก์ ํธ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค.
- ์ฒ์ ๋คํธ์ํฌ ํต์ ์ ๊ตฌํํ ๋๋ RxSwift์ฒ๋ผ Combine์ ์ฌ์ฉํ์๋๋ฐ ์ดํ์ async/await์ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค. async/await์ ์ฌ์ฉํ๊ฒ ๋๋ ๋น๊ต์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ฒ ๋์๋ค.
- ์ด๋์ ๋ SwiftUI๊ฐ ์ต์ํด์ง๊ณ ๋ ํ ์ํคํ ์ณ๋ฅผ ์ ์ฉํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ฐ์ฅ ์ ๋ช ํ๋ค๋ TCA๋ฅผ ์ ์ฉํ๊ณ ์ ๊ตฌ์กฐ์ ๋ํ ํ์ต์ด ํ์ํ์ฌ ์ ์ฉํ๋๋ฐ ์๊ฐ์ด ์ข ํ์ํ์๋ค. ์์ ์ฝ๋๋ฅผ ํตํด ํ์ต ํ ๋ฆฌํฉํ ๋ง์ ํ์๋๋ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ ธ๋ค. ์ด์ ์ ์ ์ฉํด๋ณด์๋ ReactorKit๊ณผ ๋น์ทํ์ฌ ์ดํดํ๋๋ฐ ํฐ ์ด๋ ค์์ ์์๋ค.