Firebase 更高效的数据管理

问题描述 投票:0回答:1

每次我导航到充满帖子的视图时,速度都非常慢。我的社交网络平台有很多帖子,我需要更有效的数据管理来获取帖子。

代码中是否有任何部分需要更改或删除?

func fetchPosts(completion: @escaping (Result<[PostWithUser], Error>) -> Void) {
        DispatchQueue.global(qos: .background).async { [weak self] in
            guard let self = self else { return }

            if !self.cachedPosts.isEmpty {
                DispatchQueue.main.async {
                    completion(.success(self.cachedPosts))
                }
                return
            }

            self.postsRef.order(by: "timestamp", descending: true).getDocuments { snapshot, error in
                if let error = error {
                    DispatchQueue.main.async {
                        completion(.failure(error))
                    }
                    return
                }

                guard let documents = snapshot?.documents else {
                    DispatchQueue.main.async {
                        completion(.success([]))
                    }
                    return
                }

                let group = DispatchGroup()
                var postsWithUsers: [PostWithUser] = []

                for document in documents {
                    group.enter()
                    let data = document.data()

                    guard let userId = data["userId"] as? String,
                          let parentId = data["parentId"] as? String,
                          let groupId = data["groupId"] as? String,
                          let text = data["text"] as? String,
                          let isPinned = data["isPinned"] as? Bool,
                          let imageUrl = data["imageUrl"] as? String,
                          let videoUrl = data["videoUrl"] as? String,
                          let timestamp = data["timestamp"] as? Timestamp,
                          let views = data["views"] as? Int else {
                        group.leave()
                        continue
                    }

                    let post = Post(id: document.documentID, userId: userId, parentId: parentId, groupId: groupId, text: text, imageUrl: imageUrl, videoUrl: videoUrl, timestamp: timestamp.dateValue(), isPinned: isPinned, likedBy: [], views: views)

                    self.usersRef.document(userId).getDocument { userDocument, error in
                        defer { group.leave() }

                        if let userDocument = userDocument, let userData = userDocument.data() {
                            let user = User(
                                id: userId,
                                username: userData["username"] as? String ?? "",
                                bio: userData["bio"] as? String ?? "",
                                profilePictureUrl: userData["profileImageUrl"] as? String ?? "",
                                privateProfile: userData["privateProfile"] as? Bool ?? false,
                                privateFollowerList: userData["privateFollowerList"] as? Bool ?? false,
                                privateFollowingList: userData["privateFollowingList"] as? Bool ?? false,
                                privateReplies: userData["privateReplies"] as? Bool ?? false,
                                privateLikes: userData["privateLikes"] as? Bool ?? false,
                                accountDeactivated: userData["accountDeactivated"] as? Bool ?? false
                            )
                            let postWithUser = PostWithUser(post: post, user: user)

                            DispatchQueue.main.async {
                                postsWithUsers.append(postWithUser)
                            }
                        } else {
                            print("Failed to fetch user data for userId: \(userId), error: \(String(describing: error))")
                        }
                    }
                }

                group.notify(queue: .main) {
                    self.cachedPosts = postsWithUsers
                    completion(.success(postsWithUsers))
                }
            }
        }
    }

我尝试更改线程,但没有注意到任何变化。

swift firebase google-cloud-firestore swiftui
1个回答
0
投票

您正在调用

getDocuments
,这意味着所有文档都会从服务器检索 - 即使它们可能已经存在于本地缓存中。

加快获取文档速度的唯一方法是获取更少的文档、更小的文档或使用更快的网络连接。代码中的任何更改都不会改变这些因素。

为了更好地利用本地缓存,请使用实时监听器 (

addSnapshotListener
)。这将立即使用本地缓存中的文档触发,然后在从服务器获取任何更新时再次触发。

© www.soinside.com 2019 - 2024. All rights reserved.