swift - 从 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
}
}
}
}
}
解决方案
请注意,它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
}
}
}
}
}
推荐阅读
- javascript - JavaScript 验证方法未按预期工作
- c++ - 为什么在向量中的限制后我无法推动一对?
- java - Retrofit POST java.io.IOException: java.io.EOFException 导致 Connection 上的流意外结束: \n not found:
- python - 图书馆如何运作?尝试安装 mouseinfo
- python - 从 opencv videowriter api 运行 gstreamer 管道命令以将连续图像流式传输到 hlssink
- java - 在不更改默认正文的情况下自定义 Spring Boot 错误响应代码
- vim - Vim 键绑定以调用来自用户的输入的函数
- javascript - POST 401 未经授权
- html - 如何将 CSS 下拉列表与其父 div 右对齐?
- python - 在 pandas 中的数据框中显示和添加列