Получение неверных данных во вложенном запросе | Пожарный магазин - PullRequest
0 голосов
/ 29 мая 2020

В этом случае я сначала получаю свой 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
    }
...