Open JD-man opened 2 years ago
피쳐가 수행하는 로직과 UI 렌더링할 데이터
피쳐 내에서 수행되는 액션
API, Analytics 등과 같은 피쳐가 필요한 dependency
주어진 Action에 대해서 State를 어떻게 변화시킬지에 대한 함수
Effect를 반환하는 API Request와 같은 effect가 일어난다.
모든 Action들은 Store로 보내지고 Store는 Reducer와 Effect를 돌린다.
이렇게 State를 업데이트 시키고 Observing하며 UI에 반영한다
이딴짓을 하는 이유는 테스트가 용이해지고 크고 복잡한 피쳐를 작은 도메인으로 나눌 수 있다는 장점이 있어서다.
Button("−") { viewStore.send(.decrementButtonTapped)
.alert(
item: viewStore.binding(
get: { $0.numberFactAlert.map(FactAlert.init(title:)) },
send: .factAlertDismissed
),
특이한점은 Reducer에서도 Side Effect가 있으며 그 액션을 다시 받고있다.
let appReducer = Reducer<AppState, AppAction, AppEnvironment> { state, action, environment in
switch action {
case .factAlertDismissed:
state.numberFactAlert = nil
return .none
case .decrementButtonTapped:
state.count -= 1
return .none
case .incrementButtonTapped:
state.count += 1
return .none
case .numberFactButtonTapped:
return .task {
await .numberFactResponse(TaskResult { try await environment.numberFact(state.count) })
}
case let .numberFactResponse(.success(fact)):
state.numberFactAlert = fact
return .none
case .numberFactResponse(.failure):
state.numberFactAlert = "Could not load a number fact :("
return .none
}
}
What is the Composable Architecture?
Learn More
Examples