์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CollectionView
- MVVM
- Kuring
- SnapKit
- RxSwift
- UIKit
- swift
- ํจ์คํธ์บ ํผ์ค
- combine
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค
- node.js
- visionOS
- reactorkit
- rxcocoa
- ios
- realm
- BFS
- raywenderlich
- TCA
- tableView
- arkit
- XCTest
- designpattern
- Swfit
- Flutter
- SwiftUI
- Lv2
- Xcode
- BOJ
- Today
- Total
๋ชฉ๋กapple/๐ฆฅ TCA (15)
lgvv98
[TCA] HigherOrderReducers (ReusableFavoriting) ๋ชฉ์ฐจ - ๊ฐ๋ ์ค๋ช - ์์ ์ฝ๋ # ๊ฐ๋ ์ค๋ช ์ด๋ฒ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋๋ฉ์ธ, ๋ก์ง, ๋ทฐ์ ์ด๋ฅด๊ธฐ๊น์ง ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง๋ฅผ ์๊ฐ. ์ด๋ฒ ๊ธฐ๋ฅ์ "์ข์์" ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ฒํผ ์ก์ ์ ํตํด ์์ ์ ์ํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. ํด๋น ๋ฒํผ์ ๋๋ฅด๋ฉด UI์ ์ฆ์ ๋ฐ์๋๊ณ DB๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋, API ์์ฒญ์ ํ๋ ๋ฑ ํ์ํ ์์ ์ ์ํํ๊ธฐ ์ํ ํจ๊ณผ๊ฐ ๋ฐ์. ์คํ์ 1์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ 25% ํ๋ฅ ๋ก ์คํจํ๋๋ก ์์ ๋ฅผ ๋ง๋ค์์ผ๋ฉฐ, ์คํจํ ๊ฒฝ์ฐ ์ํ๊ฐ ๋กค๋ฐฑ๋๊ณ ๊ฒฝ๊ณ ์๋ฟ์ด ๋ํ๋จ. # ์์ ์ฝ๋ // MARK: - Reusable favorite component // ๐ 1. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ FavoriteState๋ฅผ ์ ์ธ st..
[TCA] HigherOrderReducers #1 (Recursion) ๋ชฉ์ฐจ - ์ด๋ฒ ์ฃผ์ ์ ๋ํ ๊ฐ๋ต ์ค๋ช - ์์ ์ฝ๋ # ์ด๋ฒ ์ฃผ์ ์ ๋ํ ๊ฐ๋ต ์ค๋ช ์ด๋ฒ์๋ ์ฌ๊ท๋ฅผ ํตํด View๋ฅผ ๊ด๋ฆฌ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์์ # ์์ ์ฝ๋ ์ฃผ์ํ๊ฒ ์ดํด๋ณผ ๋ถ๋ถ 1. State๋ฅผ rows๋ก ๋ค์ ๋ค๊ณ ์์์ผ๋ก์จ Nested ํํ๋ฅผ ๊ตฌ์ฑ 2. Action์๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ํด indirect enum์ผ๋ก ์ ์ธ 3. Reducer์ forEach(...) { Self() } ํํ๋ก ์ฐธ์กฐ struct Nested: Reducer { struct State: Equatable, Identifiable { let id: UUID var name: String = "" var rows: IdentifiedArrayOf =..
[TCA] Navigation TCA์ Navigation์ ๋ํด์ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํด๋ณด์. ์๋น์ค ๊ฐ๋ฐ์์ ์ฌ์ฉํ๋ ํ๋ฉด์ ํ ๋ฐฉ์์ผ๋ก๋ ๋ช ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ฐ์ ์ ์ผ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ๋ค์ ์ ๋ฆฌํ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ฒ๋ค์ด ์์ ๋๋ง๋ค ํฌ์คํ ์ ์ ๋ฐ์ดํธ ํด๋ณด์! ์ด๋ฒ์ ์์๋ณผ ๋ชฉ์ฐจ! - ์ผ๋ฐ์ ์ธ sheet ํ๋ฉด์ ํ - navigationDestination, popover, sheet ์ฌ์ฉ - NavigationStack (feat. Path & destination) - ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ํ๋ฒ์ ์ด๋์์ผ์ผ ํ ๊ฒฝ์ฐ - struct Path: Reducer { ... } - NavigationStack์ View ๋จ์์ ์ฒ๋ฆฌ - StackElementID - ScreenA - ์ค์ค๋ก dismiss - Scre..
[TCA] Effect #6 (WebSocket) ๋ชฉ์ฐจ - ์ด๋ฒ์ ํ ์ค์ต์ ๋ํ ์ค๋ช - ์น์์ผ ๊ฐ๋ ์ ๋ํด์ ์ค๋ช ์ ์๋ต - ๋์ ์ด์ ์์ ์์์ ์น์์ผ๊ณผ ์ฐ๊ด์ง์ด ์๊ฐํด๋ณด๊ธฐ - TCA WebScoket ์์ # ์ด๋ฒ์ ํ ์ค์ต์ ๋ํ ์ค๋ช URLsession์ ์น์์ผ์ฉ API๋ฅผ ์ํ ๊ฐ๋จํ Wrapper๋ฅผ ๋ง๋ค์ด ์์ผ ์๋ฒ์ ์ ์ํ์ฌ ํ ์คํธํ ํ ๋ฉ์์ง๋ฅผ ์ ์ก ํ ์์ผ ์๋ฒ๋ ์ฆ์ ๋ฉ์์ง๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ํ์ . - ๋์ ์ด์ ์์ ์์์ ์น์์ผ๊ณผ ์ฐ๊ด์ง์ด ์๊ฐํด๋ณด๊ธฐ ๋ด๊ฐ ๊ฐ๋ฐ์ ์ฒ์ ๊ณต๋ถํ ๋น์์๋ ์น์์ผ์ ์ด๋ ๊ฒ ๋ง์ด ๋ค๋ฃจ๋ฆฌ๋ผ๊ณ ์๊ฐํ์ง ๋ชปํ๋๋ฐ, ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ๊ณ ์์. ์ฒ์ ์ด๋ก ์ด ์๋ ์น์์ผ์ ์ ํ๊ฒ ๋ ๊ฒ์ Kuringํ๋ก์ ํธ์์ ๊ฒ์ํํธ๋ฅผ ๊ตฌํํ๋ฉด์ ์ฒ์ ์๊ฒ ๋์๋๋ฐ, ๋น์์๋ StarS..
[TCA] Effect #5 (Timers) ๋ชฉ์ฐจ - Timers ์ฃผ์ ์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด๊ธฐ - Timers์ ๊ด๋ จํ ์์ # Timers ์ฃผ์ ์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด๊ธฐ @Dependency(\.continuousClock) var clock ์์ ๋ํ๋์ ์์ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ Swift Clocks ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ Helper์ธ ํด๋ญ์ .timer ๋ฉ์๋๋ฅผ ์ฌ์ฉ ๋น๋๊ธฐ ์ฝ๋๋ก ์๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ `AsyncSequence` ์นํ์ ์ธ API๋ฅผ ์ ๊ณต # Timers์ ๊ด๋ จํ ์์ // MARK: - Feature domain struct Timers: Reducer { struct State: Equatable { var isTimerActive = false var secondsElaps..
[TCA] Effect #4 (Refreshable) ๋ชฉ์ฐจ - Refreshable์ ๋ํ - Refreshable์ ์ฌ์ฉํ๋ ์์ # Refreshable์ ๋ํ ์ด๋ฒ์๋ List๋ฅผ ๋ฆฌํ๋ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์ ์ด๋ฒ์๋ ๋ฒํผ์ ํด๋ฆญํด์ API ์ฝํ๋๊ฒ ์๋๋ผ ๋ฆฌํ๋ ์๋ฅผ ํตํด API๋ฅผ ์ฝ ํ ์์ ์ด๋ค. ํน์ด์ ์ผ๋ก๋ viewStore.send(..., animation: ) ์ผ๋ก animation์ ๊ฑด๋ค์ฃผ์ด ๋ณผ ์์ ! # Refreshable์ ์ฌ์ฉํ๋ ์์ // MARK: - Feature domain struct Refreshable: Reducer { struct State: Equatable { var count = 0 var fact: String? } enum Action: Equata..