⏰
TCA における Swift Concurrency 時代の debounce
Combine 時代に利用していた debounce
は deprecated になっています。
Swift Concurrency を利用している場合は、以下の withTaskCancellation
が用意されているため、それで debounce を実現することができます。
withTaskCancellation
の上の方にドキュメントコメントで使用方法が記載されていますが、Clock と組み合わせて以下のようにすれば、キャンセルの挙動によって debounce が実現できます。
@Dependency(\.continuousClock) var clock
enum CancelID { case response }
// ...
return .run { send in
await withTaskCancellation(id: CancelID.response, cancelInFlight: true) {
try await self.clock.sleep(for: .seconds(0.3))
await .send(
.debouncedResponse(TaskResult { try await environment.request() })
)
}
}
Discussion