Slide 9
Slide 9 text
case .fetchRecentNews:
// (省略)Loading状態を表現するためにStateの内容を更新する
// (処理例)API経由で最新情報データを取得する処理
return .run { send in
await send(
.fetchRecentNewsResponse(
Result { try await self.newsRepository.fetchRecent() }
)
)
}
ReduxのMiddlewareとTCAのEffectのイメージを整理
APIリクエスト結果で成功・失敗のAction発行からStateの更新処理における事例
case let .fetchRecentNewsResponse(.success(response)):
// (省略)成功時の状態を表現するためにStateの内容を更新する
return .none
case .fetchRecentNewsResponse(.failure):
// (省略)失敗時の状態を表現するためにStateの内容を更新する
return .none
同じReducer内で .send(…) を実行してActionを発行
@Dependency経由で取得したRepositoryの処理を実行
func resentNewsMiddleware() -> Middleware {
return { state, action, dispatch in
switch action {
case let action as FetchRecentNewsAction:
requestFetchRecentNews(action: action, dispatch: dispatch)
default:
break
}
}
}
Task { @MainActor in
do {
let response = try await NewsRepositoryFactory.create().fetchRecent()
dispatch(SuccessFetchRecentNewsResponseAction(response))
} catch APIError.error(let message) {
dispatch(FailureFetchRecentNewsResponseAction())
}
}
}
1. TCAのEffectを利用した処理: 2. ReduxのMiddlewareを利用した処理:
Middleware関数内でRepositoryをインスタンス化して処理を実行
関数内で dispatch() を実行してActionを発行
private func requestFetchRecentNews(action:
FetchRecentNewsAction, dispatch: @escaping Dispatcher)