
안녕하세요 !
오늘은 TCA 비동기 처리에 대해서 작성해보려합니다
TCA에서 비동기 작업을 어떻게 처리하는지, 특히 .run 메서드를 사용하여 사이드 이펙트를 관리하는 방법에 대해 자세히 살펴볼게요!
TCA에서 비동기 작업은 Effect 타입을 통해 처리되고 이는 상태를 제어하고 사이드 이펙트를 관리하는 일관된 방식을 제공합니다
비동기 작업을 처리하는 핵심 메서드는 .run입니다 이 메서드를 사용하여 네트워크 요청, 데이터베이스 작업 등의 비동기 작업을 수행할 수 있습니다
case .onServerRequestButtonTapped:
return .run { send in
// 비동기 코드 실행
} catch: {
// 에러 처리
}
.run 메서드는 클로저를 받아 비동기 작업을 수행하고 send 파라미터를 통해 작업 결과의 상태 값을 변경합니닫
case .requestButtonTapped:
return .run { send in
let fetchedImage = try await requestImages()
await send(.requestResponse(fetchedImage))
} catch: { error, send in
print(error)
}
case let .requestResponse(image):
state.image = image
return .none
private func requestImages() async throws -> Image {
Task { try! await Task.sleep(for: .seconds(1)) }
return Image(systemName: "checkmark.circle.fill")
}
설명
- .requestButtonTapped 액션이 발생하면 .run 메서드 실행
- requestImages() 함수는 비동기적으로 이미지를 가져옴 (여기서는 시뮬레이션을 위해 1초 대기 후 시스템 이미지를 반환)
- 이미지 가져오기가 성공하면 .requestResponse 액션을 통해 결과를 전달
- .requestResponse 에서 상태를 업데이트
- 사이드 이펙트: TCA에서 사이드 이펙트는 상태를 직접 변경하지 않고 외부 영역과 상호작용하는 작업을 말합니다. (네트워크 요청, 파일 시스템 접근 등이 여기에 해당)
- Effect: TCA에서 모든 사이드 이펙트는 Effect 타입으로 표현되며 이는 비동기 작업의 결과를 액션으로 변환하여 상태를 업데이트할 수 있게 해줍니다
- 스레드 관리: .run 메서드 내부의 코드는 백그라운드 스레드에서 실행되지만, send 함수를 통해 전달되는 액션은 자동으로 메인 스레드에서 처리됩니다 이를 통해 UI 업데이트와 관련된 작업을 안전하게 수행할 수 있습니다.
- 에러 처리: .run 메서드는 catch 블록을 통해 에러 처리 로직을 포함할 수 있고 이를 통해 비동기 작업 중 발생할 수 있는 예외 상황을 처리할 수 있습니다
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.