🍎

[SwiftUI] [TCA] Reducer内で続けてAction処理

2022/10/08に公開

概要

例えば以下のようなActionを定義しており、
ViewからはgetIdのみをsendした前提で、
getIdのAction後にそのままgetInfoのActionも行いたい。

switch action {
  case .getId:
    return environment.fact.getId
      .receive(on: environment.mainQueue)
      .catchToEffect(Action.getIdResponse)
    
  case let .getIdResponse(.success(response)):
    state.id = response
    return .none

  case .getIdResponse(.failure):
    return .none

  case let .getInfo(id):
    // 引数idを使用したリクエスト
    return .none
}

ソース

概要の内容をEffect(value:を使用することで可能です。

switch action {
  case .getId:
    return environment.fact.getId
      .receive(on: environment.mainQueue)
      .catchToEffect(Action.getIdResponse)
    
  case let .getIdResponse(.success(response)):
    state.id = response
    return Effect(value: .getInfo(response))

  case .getIdResponse(.failure):
    return .none

  case let .getInfo(id):
    // 引数idを使用したリクエスト
    return .none
}

参考

https://github.com/pointfreeco/swift-composable-architecture/blob/4449bc2e249ba909086271d37b98f54e0ce725e3/Examples/CaseStudies/SwiftUICaseStudies/03-Effects-SystemEnvironment.swift#L48-L49

Discussion