RxSwift ์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ
๋ค๋ฒจ๋กํผ
โฉ29,700
์ด๊ธ / iOS, Swift, RxSwift, iOS Autolayout, MVVM
3.5
(2)
RxSwift์ ๊ธฐ์ด์ ํ์ฉ๋ฒ์ ๋ค๋ฃจ๋ ๊ฐ์์ ๋๋ค
์ด๊ธ
iOS, Swift, RxSwift

๋ณต์กํ SwiftUI ์ํ ๊ด๋ฆฌ, TCA (The Composable Architecture)๋ก ๊น๋ํ๊ณ ๊ฒฌ๊ณ ํ ์ฑ์ ๋ง๋์ธ์. ์ค์ ํ๋ก์ ํธ ์์ ๋ก ํต์ฌ๋ง ๋น ๋ฅด๊ฒ ๋ฐฐ์๋๋ค.
์๊ฐ์ 65๋ช
๋์ด๋ ์ด๊ธ
์๊ฐ๊ธฐํ ๋ฌด์ ํ
๋จผ์ ๊ฒฝํํ ์๊ฐ์๋ค์ ํ๊ธฐ
5.0
ํธ๋ฅด๋ ๋
ํ๋ก์ ํธ ๋์ ์ ๋์์ด ๋ง์ด ๋์์ต๋๋ค :) ํน์ ์ง๋ฌธ๋ ๋ฐ์์ฃผ์๋์..??
5.0
JMK
์ข์ ๊ฐ์ ๊ฐ์ฌํฉ๋๋ค~ ์ถ๊ฐ ๊ฐ์ ๊ธฐ๋ํ๊ณ ์๊ฒ ์ต๋๋ค~๐๐๐๐๐
5.0
sclee
์๋ณด์์ต๋๋ค. tca ๋ง๋ณด๊ธฐ๋ก ์ข๋ค์. ๋ค์์ ์ฌ๋ฆฌ์๋ ๊ฐ์๋ถํฐ๋ ํ์ง์ด ์กฐ๊ธ๋ง ์ข์์ผ๋ฉด ํฉ๋๋ค.
TCA์ ํต์ฌ ์์(State, Action, Reducer, Store)๋ฅผ ์ดํดํ๊ณ , SwiftUI ์ฑ์ ๋ณต์กํ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
SwiftUI์ ์ต์ Stack ๊ธฐ๋ฐ ๋ด๋น๊ฒ์ด์ ๊ณผ Apple์ ์ฐจ์ธ๋ ๋ฐ์ดํฐ ํ๋ ์์ํฌ์ธ SwiftData๋ฅผ TCA ์ํคํ ์ฒ์ ํตํฉํ์ฌ ์ค์ฉ์ ์ธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒฝํ์ ์ป์ต๋๋ค.
์ด๋ฏธ์ง ํผ์ปค์ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ Reducer์์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ swift-dependencies๋ฅผ ํ์ฉํ ์ต์ ์์กด์ฑ ์ฃผ์ ๊ธฐ๋ฒ์ ์ตํ๋๋ค.
ํ์ต ๋์์
๋๊ตฌ์ผ๊น์?
๊ธฐ์กด SwiftUI์ ์ํ ๊ด๋ฆฌ ๋ฐฉ์(@State, @Binding, ObservableObject)์ ํ๊ณ๋ฅผ ๋๋ผ๊ณ , ๋ณด๋ค ์ฒด๊ณ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๋์ ํ๊ณ ์ถ์ ๊ฐ๋ฐ์
์ค๋ฌด์์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ ํ๋ก์ ํธ ๊ธฐ๋ฐ์ ํ์ต์ ํตํด TCA์ ์ด๋ก ๊ณผ ์ค์ ๋ฅผ ํจ๊ป ๊ฒฝํํ๊ณ ์ถ์ ๊ฐ๋ฐ์
์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ ธ๋ ์ ์ง๋ณด์ ๋ฐ ํ ์คํธ๊ฐ ์ฉ์ดํ, ํ์ฅ์ฑ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ์ ๊ฐ๋ฐ์
์ ์ ์ง์,
ํ์ํ ๊น์?
Swift ๊ธฐ์ด
481
๋ช
์๊ฐ์
34
๊ฐ
์๊ฐํ
28
๊ฐ
๋ต๋ณ
4.6
์
๊ฐ์ ํ์
5
๊ฐ
๊ฐ์
6๋ ์ฐจ iOS ๊ฐ๋ฐ์ ๋ค๋ฒจ๋กํผ์ ๋๋ค
ํ์ ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ์
์ด์ค๊ธ ๋ ๋ฒจ์๊ฒ ํ์ํ ๊ฐ์๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค
์ ์ฒด
36๊ฐ โ (5์๊ฐ 3๋ถ)
ํด๋น ๊ฐ์์์ ์ ๊ณต:
์ ์ฒด
10๊ฐ
5.0
10๊ฐ์ ์๊ฐํ
์๊ฐํ 3
โ
ํ๊ท ํ์ 5.0
์๊ฐํ 4
โ
ํ๊ท ํ์ 5.0
5
ํ๋ก์ ํธ ๋์ ์ ๋์์ด ๋ง์ด ๋์์ต๋๋ค :) ํน์ ์ง๋ฌธ๋ ๋ฐ์์ฃผ์๋์..??
๋ค ๊ทธ๋ผ์ ์ง๋ฌธ ํด์ฃผ์ธ์! ํ๋ก์ ํธ์ ๋์์ ๋๋ฆฌ๊ฒ๋์ด ์๊ด์ ๋๋ค!
๊ฐ์ฌํฉ๋๋ค! ์ฒ์ TCA๋ฅผ ์ ํ๋๋ฐ๋ ๊ฐ์๊ฐ ์๋ ์ ๋์ด ์์ด์ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง ๋ฌด๋(?)ํ๊ฒ ์ดํด๋ ํ๊ณ , ์ค์ ํ๋ก์ ํธ์๋ ์ ์ฉํด๋ณผ ์ ์์์ต๋๋ค. ๊ฐ์์์ ๋ค๋ฃฌ ๊ฒ์ฒ๋ผ ๋ง์ดํ์ด์ง โ [์ด๋ฉ์ผ / ํ๋กํ / ๋๋ค์] ์์ ํ๋ฉด์ฒ๋ผ ๋จ์ผ ๊น์ด์ ํ๋ฉด ์ด๋์ ์ดํด๊ฐ ์๋๊ณ , ๊ตฌํ๋ ์ ํ๊ณ ์์ต๋๋ค! ๊ทธ๋ฐ๋ฐ ์ค์ ์ฑ์์๋ ์ธ์คํ๊ทธ๋จ์ฒ๋ผ ๊ฒ์๋ฌผ โ ์ฌ์ฉ์ A ํ๋กํ โ ์ฌ์ฉ์ A์ ํ๋ก์ฐ ๋ฆฌ์คํธ โ ์ฌ์ฉ์ B ํ๋กํ โ ์ฌ์ฉ์ B์ ํ๋ก์ฐ ๋ฆฌ์คํธโฆ ์ด๋ฐ ์์ผ๋ก ๊ณ์ ๊น์ด์ง๋ ํ๋ฉด ์ด๋ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ฑ์ฅํ๋๋ฐ, ์ด ๋ถ๋ถ์์ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ์ ๊ฐ ๊ฐ์์์ ์ด๋ค ๋ถ๋ถ์ ๋์น ๊ฑด์ง, ์๋๋ฉด ์ด๋ฐ ๋ค์ธต(?), ์ค์ฒฉ(?) ๋ค๋น๊ฒ์ด์ ํจํด์ ์๋ TCA์์ ์กฐ๊ธ ๊น๋ค๋ก์ด ํธ์ธ์ง ์กฐ์ธ์ ์ป๊ณ ์ถ์ต๋๋ค! ํน์ ๋ชฐ๋ผ์ ํ์ฌ ๊ตฌํํ ๋ฐฉ๋ฒ์ ๋ง์๋๋ฆฌ๋ฉด ๋ง์ดํ์ด์ง์ ๊ดํ ๋ค๋น๊ฒ์ด์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ์ฌํ์ฉ ๊ฐ๋ฅํ ์ค ์์๋๋ฐ, ๊ทธ๋ฌ๊ธฐ๋งํ๋ฉด ํฐ์ ธ๋ฒ๋ ค์ ์ง๊ธ์.. ๋ง์ดํ์ด์ง์์ ์ด๋๊ฐ๋ฅํ ์ผ์ด์ค๋ฅผ [ํ๋ก์ฐ/ํ๋ก์ ๋ฆฌ์คํธ, ๊ฒ์๋ฌผ] ํ๋ฉด ์ผ๋ก ๊ฐ์ ํ๋ค๋ฉด ์๋ฅผ ๋ค์ด 1๋ฒ ํญ์ด ๊ฒ์๊ธ ๊ด๋ จ์ด๋ผ๊ณ ํ๋ค๋ฉด ๊ฒฐ๊ตญ ๋ง์ดํ์ด์ง๋ก ๋ค์ด๊ฐ์ผํ์์์? 2๋ฒ ํญ์ด ๋ฆด์ค/์ผ์ธ ๊ด๋ จํญ์ด๋ผ๊ณ ํ๋ค๋ฉด ์ฌ๊ธฐ์๋ ๊ฒฐ๊ตญ ๋ง์ดํ์ด์ง๋ก ๋ค์ด๊ฐ์ผํ๊ตฌ์ ๊ทธ๋ฐ๋ฐ ์ง๊ธ์ ๊ฐ ํญ ํ๋ฉด์์ ๋ง์ดํ์ด์ง ํ๋ฉด์ ํ ์ผ์ด์ค๋ฅผ ์ ๋ถ ๋์ผํ๊ฒ ๋ณต๋ถํด์ ์ฌ์ฉ ์ค์ด์์ ใ
๋ต๋ณ์ ์๋์ ๋ชป๋ด์ ๋๋ฌด ๋ฆ์ด์ก๋ค์ ์ฃ์กํฉ๋๋ค.. ํฐ์ ธ๋ฒ๋ฆฐ ์์ธ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ค๋น๊ฒ์ด์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๋ฐ์ ์๋ก ๋ค๋น๊ฒ์ด์ ์ ๋ด๋นํ๋ ํ์ ๋ฆฌ๋์๋ฅผ ๋ง๋ค์ด ๋๊ณ ํด๋น ๋ฆฌ๋์์ ์ง์ ํ ์ค์ฝํ๋ฅผ ๋ชจ๋ ์ง์ ํด์ค๋ค์ Scope(state: \.profile, action: \.profile) { ProfileFeature() } ๋ถ๋ชจ ํญ๋ง๋ค StackState๋ก ๊ด๋ฆฌํ๋ฉด ๋ ๊ฑฐ๊ฐ์ต๋๋ค state.path.append(.profile(ProfileFeature.State(userId: "me"))) ์ฌ๊ธฐ์๋ ์ค๋๊น์ด ์ ๋์ง์์ ์ฝ๊ธฐ ์ด๋ ค์ฐ์ค๊ฑฐ๊ฐ๋ค์ใ ใ @Reducer struct Path { @ObservableState enum State: Equatable { case profile(ProfileFeature.State) } enum Action { case profile(ProfileFeature.Action) } var body: some ReducerOf<Self> { Scope(state: \.profile, action: \.profile) { ProfileFeature() } } } @Reducer struct HomeTabFeature { @ObservableState struct State: Equatable { var path = StackState<Path.State>() } enum Action { case path(StackAction<Path.State, Path.Action>) case didTapMyProfile } var body: some ReducerOf<Self> { Reduce { state, action in switch action { case .didTapMyProfile: state.path.append(.profile(ProfileFeature.State(userId: "me"))) return .none ...
์๊ฐํ 1
โ
ํ๊ท ํ์ 5.0
์๊ฐํ 1
โ
ํ๊ท ํ์ 5.0
์๊ฐํ 25
โ
ํ๊ท ํ์ 4.2
์ง์๊ณต์ ์๋์ ๋ค๋ฅธ ๊ฐ์๋ฅผ ๋ง๋๋ณด์ธ์!
๊ฐ์ ๋ถ์ผ์ ๋ค๋ฅธ ๊ฐ์๋ฅผ ๋ง๋๋ณด์ธ์!
โฉ69,300