SwiftUI - TCA .cancellable(id:)와 .cancel(id:)

CodeCat·2024년 9월 7일

IOS SwiftUI TCA

목록 보기
6/20
post-thumbnail

안녕하세요

오늘은 .cancellable(id:)와 .cancel(id:) 주제로 작성해보려합니다

먼저 이 두 메서드의 기본 개념과 사용 방법을 살펴본 후, 실제 예제를 통해 어떻게 활용되는지 자세히 알아보겠습니다. 그럼 시작해볼까요?

.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 완료 직전에 발생할 경우, 취소가 적용되지 않을 수 있습니다.
  • 리소스 정리: 취소된 작업과 관련된 리소스를 적절히 정리해야 합니다.

이상으로 포스팅 마무리 하겠습니다.

.
.
.

감사합니다.

profile
코드와 고양이의 만남

0개의 댓글