TCA 1.7 Reducer

김재형·2024년 8월 29일
0
post-custom-banner

들어가기에 앞서

자 이번시간에는 TCA 에서 말하는 리듀서에 대해서 정리해 보려고 합니다.
사실 Reducer 패턴에서 한번 정리했던 내용이긴하지만 TCA는 다른 것을 예기할수 있으니 한번 알아보도록 하겠습니다.

Reducer

위의 문서의 내용을 직역하면 이렇습니다!
"작업이 주어졌을 때 응용 프로그램의 현재 State를 다음 State로 전환하는 방법을 설명하고 나중에 Store에서 실행해야 하는 Effect를 설명하는 프로토콜입니다."

자 상당히 설명이 난해합니다. 천천히 이해해 보도록 하겠습니다.


public protocol Reducer<State, Action> {
  
  associatedtype State

  associatedtype Action

  associatedtype Body
  
  func reduce(into state: inout State, action: Action) -> Effect<Action>

  @ReducerBuilder<State, Action>
  var body: Body { get }
}

Reducer는 위와같은 형태로 설계되어 있습니다.
전에 배웠던것을 다시 복습할겸 재설명 해보겠습니다.

  • State는 리듀서가 관리하는 상태를 정의합니다.

  • Action은 리듀서가 처리하는 액션을 정의합니다. 상태를 변경하기 위해 발생하는 이벤트를 처리합니다.열거형으로 정의하며, 각 케이스에 따라 이벤트를 처리합니다.

  • Body는 리듀서의 몸 즉 본체를 정의합니다. SwiftUI의 View에서 Body와 비슷한 개념으로, 리듀서의 액션의 따를 이벤트를 정의합니다.

  • reduce 메서드는 리듀서의 핵심 메서드로, 상태(State)를 직접 변경하고 액션(Action)을 처리하여 그 결과로 새로운 (Effect)를 반환합니다. Effect는 비동기 작업을 나타내며, 작업이 완료된 후 새로운 액션을 발생시킬 수 있습니다. in-place로 상태를 변경합니다. 즉, 상태가 inout 파라미터로 전달되는 구조이죠.

  • ReducerBuilder 각 리듀서를 차례로 실행하며, Effect 들을 병함하고, 여러 리듀서를 하나의 리듀서로 결합하는 결과 빌더 입니다.

자 다시 정리해 본다면, 결국 Reducer는 각 상태, 액션을 받아 이에 따른 로직을 구성하는 것 이라고 할수 있겠죠?

Reducer와 Store

StoreReducer의 상태(State)와 액션(Action)을 처리하고, 이를 뷰와 연결하여 UI를 업데이트합니다. 즉 Store는 앱의 상태 저장소이며, Reducer를 통해 상태와 액션을 관리합니다.
Reducer가 Store 내에서 액션을 처리하고, 그 결과로 상태를 변경하거나 Effect를 추적합니다.

예시 코드

@Reducer
struct MoreCharacterFeature {
  
  @ObservableState
  struct State: Equatable {
      ...
  }
  
  struct ConstViewState: Equatable {
      ...
  }
  
  enum Action {
      case viewCycleType(ViewCycleType)
      case viewEventType(ViewEventType)
      case dataTransType(DataTransType)
      case networkType(NetworkType)
      
      case delegate(Delegate)
      enum Delegate {
          
      }
      /// Binding
      case currentText(String)
      case currentIndex(Int)
      
  }
  
  enum ViewCycleType {
      case onAppear
  }
  
  enum ViewEventType {
      case onSubmit
  }
  
  enum DataTransType {
      
  }
  
  enum NetworkType {
      
  }
  
  var body: some ReducerOf<Self> {
     core()
  }
}

extension MoreCharacterFeature {
  
  private func core() -> some ReducerOf<Self> {
      Reduce { state, action in
          switch action {
         	...  
          default:
              break
          }
          
          return .none
      }
  }
}

마무리 하며

자 오늘은 TCA 에서 제공하는 Reducer에 대해서 알아보았습니다
@Reducer 매크로를 설명할까 하였으나 이미 첫시간에 한번 다루었어서 이정도로 마무리 지으려고 합니다.
모두 고생 하셨습니당 이번주도 파이팅 해봐요!!!!

참고링크

| TCA-Reducer

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글