코틀린에서 Flow와 suspend 함수는 모두 비동기 프로그래밍을 지원하지만, 사용 목적과 방식에 있어서 차이가 있습니다.
override fun getRooms(): Flow<Resource<List<Room>>> {
return flow {
emit(Resource.Loading(true))
runCatching {
val querySnapshot = fireStore.collection("rooms").get().await()
querySnapshot.documents.map { document ->
document.toObject(Room::class.java)!!.copy(id = document.id)
}
}.onSuccess {
Log.i("room", "성공")
emit(Resource.Success(it))
emit(Resource.Loading(false))
}.onFailure {
Log.i("room", "실패 ${it.message}")
emit(Resource.Error("Error: ${it.message}"))
}
}
}
override suspend fun getRooms(): Resource<List<Room>> {
return try {
emit(Resource.Loading(true))
val querySnapshot = fireStore.collection("rooms").get().await()
val rooms = querySnapshot.documents.map { document ->
document.toObject(Room::class.java)!!.copy(id = document.id)
}
Log.i("room", "성공")
Resource.Success(rooms)
} catch (e: Exception) {
Log.i("room", "실패 ${e.message}")
Resource.Error("Error: ${e.message}")
} finally {
emit(Resource.Loading(false))
}
}
채팅방을 만들 때 suspend를 이용해서 getRooms() 함수를 불러왔더니 채팅방이 만들었을 때 ui에 바로 업데이트가 되지 않는 문제가 생겼다. suspend는 단일 결과값을 불러오기 때문이었다.
suspend를 지우고 Flow로 데이터 스트림을 collectLatest로 관찰하니까 채팅방 생성 즉시 ui가 반영되는 것을 볼 수 있었다.