例如,我有一个问题列表。每个问题都有所有者 uid。通过这个uid,我应该找到需要的用户并显示他的名字和照片。我使用帮助架构组件 ViewModel 来做到这一点:
issues.forEach {
IssueRepository().getIssueOwner(it.owner).observe(this, Observer {
})
}
getIssueOwner 方法:
fun getIssueOwner(uid: String): MutableLiveData<UserEntity> {
val user: MutableLiveData<UserEntity> = MutableLiveData()
val usersReference = FirebaseDatabase.getInstance().reference.child("users")
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
query.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError?) {
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot == null) {
return
}
dataSnapshot.children.forEach {
val name = it.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
return user
}
但我确信这种方法是不正确的。你能给我一个建议,我应该如何构建我的应用程序的架构?
这:
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
给出与这个更简单的完全相同的结果:
val userReference = usersReference.child(uid)
两者之间的唯一区别是第一个片段为您提供一个包含一个项目列表的快照,而第二个片段为您提供一个仅包含该项目的快照。
val userReference = usersReference.child(uid)
userReference.addValueEventListener(object : ValueEventListener {
override fun onCancelled(error: DatabaseError?) {
throw error.toException() // don't ignore errors
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot.exists()
val name = dataSnapshot.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
请注意,您仍然无法从该getIssueOwner
方法返回用户。这是因为数据是从 Firebase 异步加载的,并且在您的return
语句执行时,onDataChange
还没有被调用。
我建议您阅读有关该主题的一些先前问题,以了解有关处理 Firebase(以及大多数现代网络)的异步性质的更多信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句