Как я могу оптимизировать этот запрос Firestore?

# #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 подписчиков. Вы бы прочитали их все несколько раз с вашим подходом.