В этом случае я сначала получаю свой uid всех пользователей, которые отправляют мне запрос на добавление в друзья, в виде списка, затем просматриваю его и нахожу данные пользователя из другой коллекции по их uid, но иногда я получаю результат несогласованности, я думаю, это потому, что если синхронный и асинхронный вызов, например, я удаляю (синхронно) из hashset и в то же время добавляю в hashset асинхронно (внутри onSuccess)
data class FriendRequest(var sentByUid: String?, var receiverUid: String?, var type: String?, var status: String?,var user: User?) {
constructor() : this("", "", "", "",null)
override fun equals(other: Any?): Boolean {
if (other is FriendRequest)
{
return other.sentByUid == sentByUid
}
return false
}
override fun hashCode(): Int {
return sentByUid.hashCode()
}
}
fun getRequestsListLive(): MutableLiveData<List<FriendRequest>> {
val reqHashSet = hashSetOf<FriendRequest>()
val reqLiveEvent = MutableLiveData<List<FriendRequest>>()
val query: Query = myFriendRequestsListRef
reqListListener=query.addSnapshotListener { qs, _ ->
val dcList = qs?.documentChanges
if (dcList!=null && dcList.isNotEmpty())
{
dcList.forEach {
if (it.type == DocumentChange.Type.ADDED) {
val requestAdded = it.document.toObject(FriendRequest::class.java)
reqHashSet.add(requestAdded)
} else if (it.type == DocumentChange.Type.REMOVED) {
val requestRemoved = it.document.toObject(FriendRequest::class.java)
Log.d("dcxyz","removed:"+requestRemoved.sentByUid)
reqHashSet.remove(requestRemoved)
}
}
if (reqHashSet.isNotEmpty()) {
reqHashSet.forEach { friendRequest ->
allUsersCollection.document(friendRequest.sentByUid!!)
.get()
.addOnSuccessListener { ds ->
val user = ds.toObject(User::class.java)
friendRequest.user = user
reqHashSet.add(friendRequest)
reqLiveEvent.value = reqHashSet.toList()
}
}
}
else{
reqLiveEvent.value = emptyList()
}
}
else
{
reqLiveEvent.value= emptyList()
}
}
reqListenerList.add(reqListListener)
return reqLiveEvent
}