๋ชฉ์ฐจ
๋ค์ด๊ฐ๊ธฐ ์ ์
๐ฅ์ค๋ ๋ง ์๋กญ๊ฒ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
launch ์ ์ฐ์์
์ฐ์ ๊ฐ๋ฐ ์ค์๋ ์๋์ ๊ฐ์ด launch๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
viewModelScope.launch { ``` }
lifecycleScope.launch { ``` }
์ ์ฝ๋๋ ๊ฐ๊ฐ ๋ทฐ๋ชจ๋ธ๊ณผ ์กํฐ๋นํฐ ๋๋ ํ๋๊ทธ๋จผํธ์ ๊ฐ์ ํน์ ๊ตฌ์ฑ ์์์ ์๋ช ์ฃผ๊ธฐ์ ์ฐ๊ฒฐ๋ ์ฝ๋ฃจํด์ ์คํํ๋๋ฐ ์ฌ์ฉํ๋ค.
๋๋ ๋ฑ ์ฌ๊ธฐ๊น์ง๋ง ์๊ณ launch๋ฅผ ์ฌ์ฉํด์๋ค...
์ฐ์ ์ค๋ ๊ตฌํํ ๊ฒ์ ์ํ๋ช ์ ํ์ํด์ฃผ๋ ๊ธฐ๋ฅ์ด์๋ค.
์ด ๋ api๋ฅผ ์ด 3๊ฐ ํธ์ถํด์ฃผ์ด์ผํ๋ค.
์๋์ ๊ฐ์ด A api ํธ์ถ ๊ฒฐ๊ณผ ๋ฐ์ ๊ฐ์๋ฌธ ๋ฐ์ดํฐ๋ฅผ ํตํด ๊ฐ์๋ฌธ์ id๋ฅผ ์ป๊ณ , ๊ทธ id๋ฅผ ํตํด B api๋ฅผ ํธ์ถํ์ฌ ์ํ ์ ๋ณด๋ฅผ ์ป๋๋ค.
์ํ ์ ๋ณด์์ ์ํ id ๊ฐ์ ํตํด C api๋ฅผ ํธ์ถํ์ฌ์ผ ์ํ ๋ช ์ ์ป์ ์ ์๋ ๊ตฌ์กฐ์๋ค.
๊ทธ๋ ๊ฒ ์ป์ ์ํ๋ช ์ ๊ฐ๊ฐ์ ๊ฐ์๋ฌธ์์ ๋ณด์ฌ์ผํ๋ค.
๊ทธ๋์ ๋๋ aunch๋ฅผ ํตํด ๋ทฐ๋ชจ๋ธ์์ ์ฝ๋ฃจํด ์ค์ฝํ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ api๋ฅผ ํธ์ถํ์ฌ์ ์ป์ movieName์ ํ๋ฉด์ ํ์ํ ๊ฐ์๋ฌธ ๋ฐ์ดํฐ์ add ํด์ฃผ์๋ค.
๊ฒฐ๊ณผ, ์ํ๋ช ์ด ํ๋ฉด์ ํ๋๋ ๋ํ๋์ง ์์๋ค.
๋ฐ๋ก launch๋ฅผ ์ฌ์ฉํด์ค์ผ๋ก์จ ๋ํ๋ ๋ฌธ์ ์๋๋ฐ ,,
launch ํจ์๋ ๋จ์ํ ๋น๋๊ธฐ ์์ ์ ์์ํ์ง๋ง ํธ์ถํ๋ ๋ถ๋ถ์์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๊ธฐ ์ ์ ํ๋ฉด์ ํ์ํ ๊ฐ์๋ฌธ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ํ๋ช ์ด ๋ฐ์๋์ง ์๋ ๊ฒ์ด๋ค.
launch waits for no one...
๋ฐ๋ผ์ ์ง๊ธ ํ์ํ ๊ฒ์ ?!
์ํ๋ช ๋ฐ์ดํฐ๊ฐ ์ฌ ๋๊น์ง ๊ฐ์๋ฌธ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ค๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด async์ await๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ด๊ฐ ๊ธฐ๋ค๋ ค์ค๊ฒ !!! async & await
async๋ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ์ฝ๋ฃจํด์ ์์ํ๋ ํจ์
await๋ ๊ทธ ์ฝํฌ๋ฆฐ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
์ด ๋๊ฐ์ง๋ฅผ ํตํด ์ํ๋ช ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ํ ๊ฐ์๋ฌธ ๋ฐ์ดํฐ๋ค์ ๊ตฌ์ฑํ๊ฒ ๋์ด ์ํ ์ด๋ฆ์ ์ ๋๋ก ํ์ํด์ค ์ ์๋ค.
์ฆ ๋น๋๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
๋๋ ๊ฐ ๊ฐ์๋ฌธ ์์ดํ ๋ง๋ค ์ํ ์ด๋ฆ์ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ ์์ ใ ๋ฅด async๋ก ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ awaitAll() ๋ก ๋ชจ๋ ๊ธฐ๋ค๋ฆฐ ๋ค์ ๊ฐ์๋ฌธ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ฃผ๋๋ก ํ๋ค.
val reports =
reportList?.map { reportItem ->
async {
ReportItem(
reportItem.reportId,
reportItem.title,
reportItem.content,
reportItem.createDate,
reportItem.imageUrl,
reportItem.nickname,
reportItem.likeCount,
reportItem.replyCount,
reportItem.bookmarkCount,
bookmarkList.any {
it.reportId == reportItem.reportId
},
checkLikeStateUseCase(reportItem.reportId).first(),
// ์ํ๋ช
์ ๊ฐ์ ธ์ค๋ ํจ์
getName(reportItem.reportId),
)
}
}?.awaitAll() // ๊ธฐ๋ค๋ฆฐ๋ค
๊ทธ๋ฆฌ๊ณ ์ํ๋ช ์ ๊ฐ์ ธ์ค๋ ํจ์๋ ์๋์ ๊ฐ๋ค.
private suspend fun getName(reportId: String): String {
return withContext(Dispatchers.IO) {
val report = getReportUseCase(reportId).firstOrNull()
report?.let {
getMovieNameUseCase(DetailMovieRequest(it?.movieId.toString())).firstOrNull() ?: ""
} ?: ""
}
}
์ฌ๊ธฐ์๋ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ ๋๋ฐ flow ๋ณ์์์ ๊ฐ์ ๋ฐ์ ๋ collect๋ง ์ฌ์ฉํด์์๋ค.
๊ทธ๋ฐ๋ฐ first๋ฅผ ํตํด์๋ ๋จ ํ๋ฒ์ ๊ฐ์ ๋ฐ๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
firstOrNull()
- ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ๊ฐ์ ๋ฐ์ผ๋ฉด ๋ฐ๋ก ๋ฐํํ๊ณ , ๊ฐ์ด ์์ผ๋ฉด null์ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์์ด๋ค.
- ํ๋ฆ์ด ๋จ ํ๋ฒ์ ๊ฐ์ ๋ฐ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
collect
- flow์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ ๋ ์ฌ์ฉ๋๋ ํจ์
- ์ฐ์์ ์ธ ๊ฐ์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํ๋ค
์ฆ collect๋ ํ๋ฆ์ด ์๋ฃ๋ ๋๊น์ง ๋ชจ๋ ๊ฐ์ ์ฒ๋ฆฌํ๊ณ firstOrNull์ ์ฒซ๋ฒ์งธ ๊ฐ๋ง์ ์ฒ๋ฆฌํด์ค๋ค.
๊ทธ๋ ๊ฒ ์์ฑ๋ ํ๋ฉด์ด๋น
'๐ค2024 ์๋๋ก์ด๋ > Filmo ์ํ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐จ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ์คํฌ๋กค ์ ๋ํ๋ ๊ฒฝ๊ณ (3) | 2024.10.13 |
---|---|
๐๋ฌดํ ์คํฌ๋กค ์์ ๊ตฌํํด๋ณด๋ค. (5) | 2024.10.12 |
Android : ๊ฐ์๋ฌธ ๋ฑ๋ก ๊ณผ์ ์ ๋ฆฌ (5) | 2024.08.29 |
๐ ๋ฆฌ์คํธ ์ด๊ธฐํ์ ์ค์์ฑ.. (0) | 2024.08.24 |
์ฌ๋ฌ ๊ฐ์ flow์ combine์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ (0) | 2024.07.05 |