【发布时间】:2022-06-27 21:23:27
【问题描述】:
我正在做我的最后一年项目,我真的很难决定是否应该使用 Kotlin 的回调或协程。我为 firebase 创建了单独的模块,它的所有操作都在那里完成,以适应它的数据检索或任何其他功能。
问题是,每当我从函数返回用户时,由于异步调用,它返回 null,比我理解的要多,之后我像这样使用回调:
fun getUserAsModel(callback: (User) -> Unit) {
FirebaseAuth.getInstance().uid?.let {
firestore.collection(Constants.FireCollections.USERS)
.document(it)
.get()
.addOnSuccessListener { it1 ->
val user = it1.toObject(User::class.java)?.let { it2 ->
callback(it2)
}
}
.addOnFailureListener {
Log.e(TAG, "In userModel()->", it)
it.stackTrace
}
}
}
但是我在很多形式中看到我应该使用协程,现在我正在使用这种方法但它不起作用:
fun getUser () : User? {
var user:User? = null
val collection = firestore.collection(Constants.FireCollections.USERS)
val document = collection.document(FirebaseAuthRepository().getCurrentUserId())
try {
scope.launch {
val snapshot = document.get().await()
user = snapshot.toObject(User::class.java)
}
} catch (e:FirebaseFirestoreException) {
Log.e(TAG, "In getUser() -> " ,e)
e.stackTrace
}
return user
}
我仍然卡住了,因为每次我使用 getUser() 时我都需要启动协程的作用域,这真的让代码变得很垃圾。
我想了解您的解决方案,我应该如何正确实施。谢谢
【问题讨论】:
-
说实话真的没关系,如果你已经完成并希望改进你的整体代码,那么你可以尝试不同的东西,当然,但不要浪费时间在“改进”上已经有效的代码。你对回调方法有什么问题吗?如果没有,就使用它,把时间花在改进项目上,而不是担心小细节
-
getUser应该完全是一个挂起函数,以便它像你想要的那样工作,此时它返回 null 似乎是有道理的 -
@a_local_nobody 感谢您的及时回复。我担心的原因是异步调用真的很慢,我的主管一直在告诉我为什么它很慢。主要原因是当我的应用程序按要求启动时,我需要在用户处理屏幕之前检查用户在 Firestore 中的电话号码,所以这里的呼叫真的很慢才能让用户检查号码。
-
不幸的是,缓慢的 api 调用只是工作的一部分 :) 您也许可以调查本地缓存数据,或者只是确保您的应用程序中有适当的加载指示器来显示正在发生的事情,但是没有'你可以做很多事情来改善它,协程和回调都不会真正产生足够的显着影响来改善这一点
-
我认为article 可能会帮助您了解从 Firestore 读取数据的几种方式之间的区别。
标签: android firebase kotlin google-cloud-firestore kotlin-coroutines