
안녕하세요
오늘은 .cancellable(id:)와 .cancel(id:) 주제로 작성해보려합니다
먼저 이 두 메서드의 기본 개념과 사용 방법을 살펴본 후, 실제 예제를 통해 어떻게 활용되는지 자세히 알아보겠습니다. 그럼 시작해볼까요?
.cancellable(id:)는 Effect에 고유 식별자를 부여하여 나중에 해당 Effect를 취소할 수 있게 해주는 메서드인 반면 .cancel(id:)는 지정된 ID를 가진 Effect를 취소하는 데 사용됩니다.
struct MyFeature: ReducerProtocol {
struct State {
var isLoading = false
var data: String?
}
enum Action {
case loadDataButtonTapped
case dataLoaded(String)
case cancelButtonTapped
}
func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
switch action {
case .loadDataButtonTapped:
state.isLoading = true
return .task {
let data = await loadData()
return .dataLoaded(data)
}
.cancellable(id: CancelID.dataLoad)
case let .dataLoaded(data):
state.isLoading = false
state.data = data
return .none
case .cancelButtonTapped:
state.isLoading = false
return .cancel(id: CancelID.dataLoad)
}
}
}
enum CancelID {
case dataLoad
}
func loadData() async -> String {
// 실제 데이터 로딩 로직
await Task.sleep(2 * 1_000_000_000) // 2초 대기
return "Loaded Data"
}
예제 설명:
.loadDataButtonTapped 액션이 발생하면, loadData() 함수를 호출하는 Effect가 생성되고 이 Effect에는 .cancellable(id: CancelID.dataLoad)를 사용하여 고유 ID가 부여됩니다
데이터 로딩이 완료되면 .dataLoaded 액션이 발생하여 상태를 업데이트하는거죠 !
사용자가 취소 버튼을 누르면 .cancelButtonTapped 액션이 발생하고, .cancel(id: CancelID.dataLoad)를 통해 진행 중인 데이터 로딩 작업을 취소할 수 있는데요
이렇게 구현하면 사용자가 데이터 로딩 중에 취소할 수 있는 기능을 제공할 수 있습니다
음 예를 들어, 네트워크 상태가 좋지 않아 데이터 로딩이 오래 걸릴 때 답답해서 취소 버튼 막 누르실때 있으시죠??
그럴떄 사용자가 작업을 중단할 수 있게 해주는 겁니다 !
- 고유한 ID 사용: 취소하려는 각 Effect에 고유한 ID를 부여해야 합니다.
- 타이밍 고려: 취소 액션이 Effect 완료 직전에 발생할 경우, 취소가 적용되지 않을 수 있습니다.
- 리소스 정리: 취소된 작업과 관련된 리소스를 적절히 정리해야 합니다.
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.