- Intent: 사용자 이벤트, 앱의 상태를 변경시키며 불변의 데이터 구조로 구현된다.
- View에서 발생 → Model에서 처리 → View 결과
- 사용자가 행할 수 있는 모든 액션을 열거형으로 정의한다.
- Model(State): View가 보여줘야 할 것. 데이터를 포함한 화면의 모든 상태
- 불변성의 특징을 가지기에, 구조체로 정의해서 상태를 바꿀 때는 기존 상태를 복사 후 새로운 객체를 만든다.
- View: Model을 받아서 화면에 그리는 역할
- Reducer: 이전 State에 Intent를 더해 새로운 State를 만들어내는 함수
class MemoViewModel: ObservableObject {
// 1. 상태 (State) - View는 이것만 바라봅니다.
@Published private(set) var state = MemoState()
private var cancellables = Set<AnyCancellable>()
private let useCase: FetchMemoUseCase // 클린 아키텍처 결합
// 2. 의도 처리 (Intent)
func send(intent: MemoIntent) {
switch intent {
case .fetchMemos:
handleFetchMemos()
case .deleteMemo(let id):
handleDeleteMemo(id: id)
case .addMemo(let content):
// 로직 처리...
break
}
}
private func handleFetchMemos() {
// 로딩 상태로 변경 (새로운 상태 생성)
state.isLoading = true
useCase.execute()
.sink(receiveCompletion: { _ in
self.state.isLoading = false
}, receiveValue: { memos in
// 데이터를 받아 새로운 상태로 업데이트
self.state.memos = memos
})
.store(in: &cancellables)
}
}