# #android #firebase #android-studio #google-cloud-firestore
Вопрос:
Я выполняю этот запрос, чтобы получить сообщения пользователя, за которым следит текущий пользователь [например, в социальных сетях]. но этот запрос занимает чертовски много времени.Как вы можете видеть , я также преобразую их в сущность post и устанавливаю соответствующие свойства для каждого, я думаю, что это главный виновник. Как я могу его оптимизировать?
у меня есть разная текущая коллекция как для пользователей, так и для сообщений в firestore
suspend fun getPostsForProfile(uid: String) = withContext(Dispatchers.IO) {
safeCall {
Log.d(" basePostRepository ", " getPostsForProfile is called ")
val Currentuid = FirebaseAuth.getInstance().uid!!
// get Posts where authorUid is equal to uid
val profilePosts = posts.whereEqualTo("authorUid", uid)
.orderBy("date", Query.Direction.DESCENDING)
.get()
.await()
.toObjects(Post::class.java)
.onEach { post ->
Log.d(" basepostRepository : getPostforProfile ", post.authorUid)
val user = getUser(post.authorUid).data!!
post.authorUsername = user.type
val isLiked_init = post.likedBy.find { item -> item == Currentuid}
post.isLiked = when (isLiked_init) {
null -> false
else -> true
}
}
Resource.Success(profilePosts)
}
}
suspend fun getUser(uid: String) = withContext(Dispatchers.IO) {
safeCall {
val currentUid = FirebaseAuth.getInstance().uid!!
val user = users.document(uid).get().await().toObject(User::class.java)
?: throw IllegalStateException()
val currentUser = users.document(currentUid).get().await().toObject(User::class.java)
?: throw IllegalStateException()
val isfollowed_init = currentUser.follows.find { item -> item == uid}
user.isfollowing = when (isfollowed_init) {
null -> false
else -> true
}
Resource.Success(user)
}
}
Комментарии:
1. Вы нашли решение?
2. Я вывел val user = getUser(post.authorUid) из цикла, так как post.authorUid всегда равен uid. это помогло. но в getPostsforFollows() [код не загружен здесь] мне не везет в оптимизации.
Ответ №1:
Есть несколько вещей, которые вы можете сделать:
1 — при получении данных используйте firestore, limit
чтобы получить только определенное количество сообщений. В идеале немного больше, чем пользователь может видеть на обычном пользовательском устройстве, размер экрана. Вероятно, от 15 до 20 и загружается больше, если пользователи прокручивают. Это хороший подход для большинства запросов, в которых вы знаете, что в них содержится огромное количество данных.
2 — сохраните данные автора в сообщение, чтобы избежать их получения отдельным звонком (даже если это один пользователь, который будет совершать один и тот же вызов снова и снова), также сохраните uid
athor . Таким образом, вы можете запросить автора uid
, за которым следит текущий пользователь, и не получать все сообщения и фильтровать их на стороне клиента.
3.не звоните пользователям, за которыми следит текущий пользователь, каждый раз, когда вы пытаетесь получить данные автора/пользователя поста. Сохраните подписчиков в коллекции и позвоните им один раз с помощью прослушивателя в реальном времени в вашем приложении.
Комментарии:
1. я не понял третьего пункта. Не могли бы вы поподробнее, пожалуйста?
2. Вы можете один раз вызвать список подписчиков текущего пользователя и прослушать изменения в нем в режиме реального времени. Таким образом, вы значительно сократите количество операций чтения в своем приложении. Представьте, что у одного пользователя 500 подписчиков. Вы бы прочитали их все несколько раз с вашим подходом.