티스토리 뷰
The Composable Architecture, Reducer
Summary 요약
Composable Architecture의 구성 요소 중 하나인 Reducer의 Quick Help(내부 코드의 주석을 통해 볼 수도 있습니다.)를 통해 볼 수 있는 Reducer의 개요내용을 보겠습니다.
Reducer는 현재 어플리케이션의 상태를 다음 상태(State)와 액션(Action)에 맞게 어떻게 진화시킬지를 묘사합니다. 또한 Store에서 이후 어떤 Effect를 실행해야하는지를 정의합니다. Reducer는 각 Action에 맞게 Effect를 반환하는데, 반환되는 Effect에 따라 그 다음의 Action을 수행하게됩니다.
Declaration
Reducer 선언방식
Reducer는 3개의 제네릭 인자를 가진 구조체로 선언되어있습니다. 제네릭 절에 정의된 제네릭 인자는 각각 State, Action, Envirionment입니다. Reducer의 Quick Time, 정의 코드 부의 주석을 보면 제네릭 인자 각각의 역할에 대한 설명이 있습니다.
Reducer's 3 generics
Reducer가 갖는 3개의 제네릭 인자들
Reducer는 3개의 제네릭 인자를 갖습니다. 각각의 타입 설명은 아래와 같습니다.
1) State : 어플리케이션 현 상태정보를 갖고 있는 타입입니다. 현재 실행하는 Action과 상황에 맞게 Reducer 내에서 상태값이 변경될 수 있습니다.
2) Action : 어플리케이션의 상태 변경을 초래하는 모든 가능한 Action들을 정의합니다. Action은 enum의 형태로서 발생가능한 Action case 들이 정의됩니다.
3) Environment : Reducer에서 반환되는 Effect들을 생산하기 위해 필요한 모든 의존성들을 갖습니다. API 클라이언트, 분석 Client, 난수생성기, 기타 등등의 것들이 그 예가 됩니다.
Note
effects 출력 상의 스레드가 무엇인지가 중요합니다. effect의 출력은 즉시 store로 돌아가는데, Store는 thread safe하지 않습니다. 그러므로, 모든 Effect들은 동일한 스레드 상에서 값을 받아야만합니다. 특히 Store가 UI를 다루는 경우에는 메인스레드에서 동작되어야만합니다. Publisher의 receive(on:) 메서드를 통해 상황에 맞는 적절한 스레드를 선택하여 사용하는 것이 좋습니다.
Reducer Initializer
Reducer 생성자
Reducer의 생성자 구현부입니다. 3개의 제네릭 타입 인자를 받고, 에러가 발생하지 않는 Effect 타입을 받환하는 클로져를 받아서, reducer를 생성할 수 있도록 되어있습니다.
Reducer Declaration
Reducer 선언 예시
위의 Swift Composable Architecture를 만든 pointfree의 깃헙을 들어가시면 TCA의 예제 프로젝트를 다운받아 사용할 수 있습니다. 해당 repo의 todo 샘플 앱의 일부 Reducer 선언코드를 보도록 하겠습니다.
Todo앱의 State, Action에 따라 변경될 Todo(State), TodoAction(Action), TodoEnvironment(Environment)인자와 그 인자 값에 맞게 실행 될 코드, 반환 될 Effect 등이 정의되어있습니다. 위 코드 의 경우, 모든 케이스에서 특정 Effect로 .none을 반환하고 있는데, 이는 이후 추가 Action을 필요로 하지 않을때 반환할 수 있습니다. 만약 추가 Action 수행이 필요한 경우, 해당 Action case를 value로 갖는 Effect를 반환하여 추가로 Action을 수행하게 됩니다.
심심할때마다 The Composable Architecture 관련 내용을 공부하고 포스팅해보도록 하겠습니다. 피드백 댓글 부탁드립니다. 감사합니다.
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
iOS Concurrency, AsyncSequence 개념, for try await 사용방법 (0) | 2022.10.22 |
---|---|
iOS ComposableArchitecture 문서, WithViewStore 개요 및 역할 (1) | 2022.04.03 |
swift 문서, 제네릭 절 인자 리스트 문법 정의 및 사용방법 (0) | 2022.04.02 |
iOS13 지원 프로토콜, Identifiable 개발자문서 개요 (0) | 2022.03.27 |
Combine CurrentValue, PassthroughSubject 개발자문서 읽기 (0) | 2022.03.13 |
- Total
- Today
- Yesterday
- swift문제
- 백준swift
- 부스트코스
- SwiftUI
- swift알고리즘
- publisher
- 스위프트
- uikit
- 알고리즘문제
- 프로그래머스
- ios
- swift 문자열
- swift언어
- 김프매매
- Protocol
- Collection
- CoreML
- swift reduce
- 자연어처리
- 컬렉션
- Swift 알고리즘
- 프로그래머스swift
- swift string
- 백준알고리즘
- 개발자문서
- createML
- swift
- 알고리즘
- swift 기초
- 프로토콜
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |