
안녕하세요 !
이번에는 TCA에서의 MainActor와 send 함수의 역할이란 주제로 작성해보려 합니다
MainActor와 send 함수의 역할, 그리고 어떻게 비동기 작업의 결과를 앱의 흐름으로 통합시키는지 살펴볼 예정입니다
TCA에서 비동기 작업을 수행할 때, 그 결과를 Reducer 상태에 반영하려면 메인 스레드에서 처리해야 하는데 이를 위해 TCA는 MainActor로 선언된 send 함수를 제공합니다
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
이 코드에서:
- requestImages() 함수는 비동기적으로 이미지를 가져옵니다
- await send(.requestResponse(fetchedImage))를 통해 가져온 이미지를 메인 스레드로 전달
- .requestResponse 액션이 메인 스레드에서 처리되어 상태를 업데이트
MainActor: MainActor는 메인 스레드에서 실행되는 작업을 담당하고 UI 업데이트와 같은 작업은 반드시 메인 스레드에서 수행되어야 하므로, MainActor는 이를 보장하는 역할을 합니다
send 함수: Send 타입의 인스턴스로, MainActor로 선언되어 있습니다. 이 함수를 통해 비동기 작업의 결과를 메인 스레드로 안전하게 전달할 수 있습니다
await 키워드: send 함수 호출 시 await 키워드를 사용하는 이유는 MainActor로의 전환이 필요할 수 있기 때문입니다
스레드 안전성: UI 업데이트는 반드시 메인 스레드에서 이루어져야 하고 이 방식은 비동기 작업의 결과가 항상 메인 스레드에서 처리되도록 보장해줍니다
일관성: 모든 상태 변경을 동일한 방식으로 처리함으로써 코드의 일관성을 유지할 수 있습니다
디버깅 용이성: 상태 변경의 흐름을 명확하게 추적할 수 있어 디버깅이 쉬워집니다
테스트 가능성: 이러한 구조는 단위 테스트를 작성하기 쉽게 만듭니다
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.