학습 전의 나와 학습 후의 습득한 지식을 비교해보려고 한다.
우선 현재 callbackFlow를 사용해 본 적이 있고, 어느 경우에 사용을 해보았냐면 네트워크 끊김 상태에 따라 Flow로 값을 반환해야 할 때 사용해봤다.
어떤 상태를 실시간으로 감지하고 있다가 값의 변경이 일어날 때마다 그 값을 Flow로 반환해야 할 때 사용하는 거 아닌가요?
흐름이죠. 데이터의 흐름 같은 거.. 데이터를 계속 해서 보내고 있지만 collect하기 전까지는 값을 방출하지 않는 cold Stream인 거죠.
콜백 기반의 비동기 작업을 Flow로 변환할 때 사용하는 코루틴 빌더입니다.
코루틴을 시작하는 함수로 코루틴의 실행 방식과 문맥을 정의한다.
빌더를 사용하면 특정 비동기 작업을 시작할 수 있고 코루틴이 언제, 어떻게 실행될지 결정할 수 있어.
비동기 방식으로 요청하면, 서버 응답이 올 때까지 기다리지 않고 바로 다음 코드를 실행할 수 있어. 응답이 오면 그제서야 필요한 작업을 실행하지.
하나의 작업을 작은 작업 단위로 쪼개서 순차적으로 실행하게 하여, 스레드를 차단하지 않고 비동기 작업을 처리할 수 있게 해준다.
비동기 이벤트를 일관성 있게 처리하고 싶어서 callbackFlow를 사용했어요. 물론 단순하게 콜백 방식으로 invoke 호출을 통해서도 처리할 수 있지만, 이 경우 반복되는 이벤트마다 리스너 등록과 해제가 필요하고 관리가 복잡해질 수 있죠. callbackFlow는 콜백을 Flow 형태로 변환해 주기 때문에 실시간 데이터 변경이 일어날 때마다 Flow로 이벤트를 방출할 수 있고, 이를 통해 데이터를 지속적으로 관찰하고 즉각 반영할 수 있습니다.(실시간 데이터 수신)
callbackFlow가 종료될 때(예: Flow 수집이 중단될 때) 콜백이나 리스너를 해제할 수 있도록 awaitClose를 사용한다. 대부분의 경우에는 리스너나 콜백 해제를 위해 awaitClose를 사용하는 것이 안전한 방법이긴 하나 꼭 필요하지 않는 경우도 있다.
자원이 아닌 단순 데이터 변환일 때
콜백이 리스너나 자원과 연결되지 않고 단순히 데이터 변환용으로 사용될 경우에는 awaitClose가 필요하지 않을 수 있어요. 예를 들어, 간단한 수학 연산이나 로컬 변수 변경처럼 특정 자원 해제가 필요 없는 경우가 그렇습니다.
한 번만 발생하는 이벤트일 때
이벤트가 한 번 발생하고 종료되는 경우에도 awaitClose가 꼭 필요하지 않을 수 있습니다. 예를 들어, 특정 단일 작업에 대한 결과를 Flow로 받고 바로 완료되는 경우에는 자원 해제 관리가 필요하지 않습니다.
callbackFlow {
trySend("Single event")
// awaitClose가 없어도 이 경우에는 문제가 발생하지 않음
}
오오 첫 글..! 앞으로의 글도 기대할게요 리즈니임 >_<