๋ค์ด๊ฐ๋ฉฐ
์๋ฒ ๊ตฌ์ถ์ด ์ด๋ ค์ด ์ด์ง ํ๋ก ํธ ๊ฐ๋ฐ์๋ผ ๋๋น๊ฐ ํ์ํ๋ฉด ํญ์ Firebase๋ฅผ ์ ์ฉํด์๋๋ฐ ์ด๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ ๋ํญ์ด ๊ฒช์์ต๋๋ค..๐ญ๐ญ
์๋ Firebase๊ฐ ๋น๋๊ธฐ๋ผ๊ณ ?
๋น๋๊ธฐ๋ ํ๊ณผ ์์ ์๊ฐ์ ๊ฒํฅ๊ธฐ๋ก ๋ค์๊ฒ ๋ค์ธ ๋๋ ๊ธํ๊ฒ ๊ณต๋ถ๋ฅผ ํ๊ฒ ๋์ต๋๋ค.์ด๋ก ์ ์ธ๊ฑฐ ๋ง๊ณ ๊ตฌํ์ ์ผ๋ก...
์ฝ๋ฃจํด์ผ๋ก? RxJava๋ก?
๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ฉด ๋์ค๋๊ฒ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋๋ผ๊ตฌ์.
์ฝ๋ฃจํด๊ณผ Rx.
์ฑ์ฉ ์ ๋ณด๋ณด๋ฉด ๋น ์ง์ง ์๊ณ ๋ค์ด๊ฐ๋ ์ฐ๋์ฌํญ์ RxJava๊ฐ ์์ด์ RxJava๋ฅผ ๊ณต๋ถํด์ผํ๋? ๊ณ ๋ฏผํ๋ค๊ฐ
๋จผ์ ์ทจ๋ฝํ ์ ๋ฐฐ์,(์ ๋ฐฐ ํ์ฌ ์ ์ ๊ฐ๋ฐ์๋ค) ๋ค๋ค ์ฝ๋ฃจํด ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ ํ์ฌ์์ Rx๋ฐฐ์ฐ๊ณ ์๋ค.
์.... ์ฝ๋ฃจํด์ด ๊ธฐ๋ณธ์ด๊ตฌ๋....(๋จ์) ํ๊ณ ์ฝ๋ฃจํด์ ์ด์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค๐
์๋๋ก์ด๋์ ์ฝ๋ฃจํด
Gradle ์ถ๊ฐ
์ฐ์ gradle ํ์ผ์ dependencies๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
//Coroutine
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.3.6'
๋ฒ์ ์ด ๋ค๋ฅผ ์ ์์ผ๋ Kotlin Github ์์ ํ์ธํด๋ด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ฐ์์ค๊ธฐ
๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํด์ค๊ฒ์. ๊ทธ ํจ์๋ suspend fun ์ผ๋ก ์ ์ํด์ค์ผ ํ๋ค๊ณ ํฉ๋๋ค.
suspend ํจ์๋ ์ด ํจ์๊ฐ ๋น๋๊ธฐ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ suspend๊ฐ ๋ถ์ด์๋๋ฐ ์ฝ๋ฃจํด scope ์ธ์ ๋ฒ์์์ ์ฌ์ฉํ๋ค๊ฑฐ๋, suspend๊ฐ ์๋๋ฐ ์ฝ๋ฃจํด scope์์์ ์ฌ์ฉํ๋ค๋ ๊ฑด ์๋ฌ๋ง ๋ฐ์์ํต๋๋ค..
suspend fun getData(): Task<QuerySnapshot> {
return db.collection("Data").get()
}
์ด๋ ๊ฒ ์ฌ์ฉํด๋ดค๋๋ฐ,Firestore์ Data๋ผ๋ ์ปฌ๋ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ Task์ด๋ผ๋ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ฆฌํด์ํค๋๋ก ํ์ต๋๋ค.
๋ฐ์ดํฐ ํ๋ฉด์ ๋ฃ์ด์ฃผ๊ธฐ
fun initUI(task: MutableList<DocumentSnapshot>) {
if (task != null) {
list = arrayListOf()
for (document in task) {
val data = DataModel()
val picture = document["Imgurl"] as String
val name = document["name"] as String
data.pictureUrl = picture
data.name = id
list.add(data)
}
adapter = DataAdapter(list)
dataList.adapter = adapter
}
}
๋ฐ์์จ ๋ฐ์ดํฐ๋ค์ RecyclerView์ ๋ํ๋ด์ค๊ฑฐ๋ผ์ ์์ ๊ฐ์ด ๋ฆฌ์คํธ์ ๋ฃ์ด์ Adapter๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค.
์ฝ๋ฃจํด ์์ฑํ๊ธฐ
์ด์ ๋ง๋ ํจ์๋ค์ ์คํํด์ฃผ๊ธฐ ์ํ ์ฝ๋ฃจํด ์ค์ฝํ๋ฅผ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
CoroutineScope(Dispatchers.Main).launch {
val deferred = getData().await().documents
initUI(deferred)
}
์ฝ๋ฃจํด ์ค์ฝํ๋
CoroutineScope(Dispatchers.Main).launch {
// Do Something
}
ํ์์ผ๋ก ์์ฑํ๋๋ฐ์,
ํ๋ผ๋ฏธํฐ ์์ ๋ค์ด๊ฐ๋ Dispatcher.Main์ ๋ฉ์ธ Thread์ ๋ํ Context๋ก, UI ๊ฐฑ์ ์ด๋ View์์ ์ ์ฌ์ฉ๋๋์.์ด ์ธ์๋Dispatcher.IO (๋คํธ์ํน์ด๋ ๋ด๋ถ DB ์ ๊ทผ ๋ฑ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ํ ์์ ์ ์ํํ ๋ ์ฌ์ฉ) ๊ณผDispatchers.Default (ํฌ๊ธฐ๊ฐ ํฐ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ๊ฑฐ๋ ํํฐ๋ง์ ์ํํ๋ ๋ฑ์ ๋ฌด๊ฑฐ์ด ์ฐ์์ด ํ์ํ ์์ ์ ์ฌ์ฉ) ์ด ์์ต๋๋ค.
์ ํ๋ฉด์ ๊ตฌ์ฑํด์ฃผ๊ธฐ ์ํด Main ์ค์ฝํ ์์์ ๋ณ์๋ฅผ ์์ฑํด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ , **await()**๋ฅผ ์ด์ฉํ์ฌ ๋ค ๋ค์ด์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ initUI๋ฅผ ์คํํ์ฌ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํ๋ฉด์ ๊ตฌ์ฑํด์ฃผ์์ต๋๋ค.
์ฝ์งํ ๊ฑฐ ์น๊ณ ์ฝ๋๊ฐ ๊ฐ๋จํด์ ์กฐ๊ธ ํ๋ฌดํ๋ค์..
์ด์ ์ด๋ ๊ฒ ๋๊ฑฐ ์ด์ ๋ ์ ๋ชจ๋ฅด์ง๋ง ์คํจํ ์ฝ๋๋ค๋ ๋จ๊ฒจ๋๊น ํฉ๋๋ค.
์ Task is not yet complete ์ผ,,?
CoroutineScope(Dispatchers.IO).launch {
val deferred = getData().documents
withContext(Main) {
initData(deferred)
}
}
์ด ๋ฐฉ๋ฒ๋ ์๋๊ณ ..
val deferred = CoroutineScope(Dispatchers.IO).async {
getData().documents
}.await()
initData(deferred)
์ด ๋ฐฉ๋ฒ๋ ์คํจํ์ต๋๋ค....
์ ์๋๋ ์ง ์์๋ ๋ถ์ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.. ๐
https://github.com/TeamGether/WillingAOS
์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ผ๋ ๊ธ์ ๋๋ค.
์ถํ ์ ๋ถ๊ฐ์ ์ผ๋ก ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ