首页 > 解决方案 > 从 Firestore 提取的数据返回重复项

问题描述

我正在尝试从 firebase firestore 获取数据。我遇到的问题是我的 fetch 返回结果 x4 次。例如,当我执行 print(name) 时,它会打印用户名 x4 次。

我认为可能有一个循环无法正常工作?

// fetches and returns all conversations for the user with passed in uid
public func getAllConversations(for uid: String, completion: @escaping(Result<[Conversation], Error>) -> Void) {
    
    let CurrentUser = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    let ConversationRef = db.collection("users").document(CurrentUser!).collection("conversations").document(
        "jVymlfbpuAYQQ9Brf8SbUZ7KCGg1")
    // get the otherUserUId TO DO
    
    ConversationRef.getDocument { snapshot, error in
        if error != nil {
                print("Error connecting to database")
        } else {
            
            if let document = snapshot {
                if document.exists {
                    let data = document.data()
                    print(data)
                    
                    let conversations: [Conversation] = data!.compactMap ({ dictionary in
                        
                        guard let conversationId = data!["id"] as? String,
                              let name = data!["name"] as? String,
                              let otherUserUid = data!["other_user-uid"] as? String,
                              let latestMessage = data!["latest-message"] as? [String:Any],
                        let date = latestMessage["date"] as? String,
                        let message = latestMessage["message"] as? String,
                        let isRead = latestMessage["is-read"] as? Bool
                        else {
                        return nil
                       }
                        print(name)
                        
                        let latestMessageObject = LatestMessage(date: date, text: message, isRead: isRead)
                        
                        return Conversation(id: conversationId, name: name, otherUserUid: otherUserUid, latestMessage: latestMessageObject)

                    })
                    completion(.success(conversations))
                }
                else {
                    completion(.failure(DatabaseError.failedToFetch))
                    return
                }
            }
        }
    }
}

标签: swiftfirebasegoogle-cloud-firestorefetch

解决方案


请注意,它ConversationRef.getDocument{..}只会返回一个您在此处引用的特定文档:

let ConversationRef = db.collection("users").document(CurrentUser!).collection("conversations").document("jVymlfbpuAYQQ9Brf8SbUZ7KCGg1”)

所以let data = document.data() 将是单个 [String:Any] 对象(在本例中为单个“对话”),而不是字典数组(例如:[对话])。

尝试这样做:

// fetches and returns all conversations for the user with passed in uid
public func getAllConversations(for uid: String, completion: @escaping(Result<Conversation, Error>) -> Void) {

    let CurrentUser = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    let ConversationRef = db.collection("users").document(CurrentUser!).collection("conversations").document(
        "jVymlfbpuAYQQ9Brf8SbUZ7KCGg1")
    // get the otherUserUId TO DO

    ConversationRef.getDocument { snapshot, error in
        if error != nil {
            print("Error connecting to database")
        } else {

            if let document = snapshot {
                if document.exists {
                    if let data = document.data() {

                        if let conversationId = data["id"] as? String,
                           let name = data["name"] as? String,
                           let otherUserUid = data["other_user-uid"] as? String,
                           let latestMessage = data["latest-message"] as? [String:Any],
                           let date = latestMessage["date"] as? String,
                           let message = latestMessage["message"] as? String,
                           let isRead = latestMessage["is-read"] as? Bool {

                            print(name)

                            let latestMessageObject = LatestMessage(date: date, text: message, isRead: isRead)
                            let conversations = Conversation(id: conversationId, name: name, otherUserUid: otherUserUid, latestMessage: latestMessageObject)

                            completion(.success(conversations))
                        }
                    }
                }
                else {
                    completion(.failure(DatabaseError.failedToFetch))
                    return
                }
            }
        }
    }
}

推荐阅读