![](/img/trans.png)
[英]SwiftUI and Firestore - logic for reading multiple documents from different collections at startup
[英]Matching collections in Firestore using SwiftUI
我正在嘗試通過使用下面的代碼匹配 collections 從 Firestore 獲取文檔。 我正在從集合(“用戶”)中獲取文檔,以防將來有人更新他們的信息,新信息只會上傳到集合(“用戶”)而不是集合(“客戶”)。
struct NewFriend: Identifiable, Hashable, Decodable {
@DocumentID var id: String?
var name: String
var uid: String
}
struct NewProspect: Identifiable, Hashable, Decodable {
@DocumentID var id: String?
var name: String
var uid: String
}
class AuthViewModel: ObservableObject {
@Published var userName = ""
@Published var friendName1 = "FriendName1"
@Published var friendName2 = "FriendName2"
@Published var friendUid1 = "friendUid1"
@Published var friendUid2 = "friendUid2"
@Published var matchingUid = ""
let friends = [NewFriend]()
let clients = [NewProspect]()
func uploadInfo() {
guard let uid = FireBaseManager.shared.auth.currentUser?.uid else { return }
let data: [String: Any] = [
"name": self.userName,
"uid": uid
]
FireBaseManager.shared.firestore.collection("users").document(uid).setData(data) { error in
if let error = error {
print("DEBUG: Failed to store user info with error: \(error.localizedDescription)")
return
}
}
}
}
func addFriend() {
guard let uid = FireBaseManager.shared.auth.currentUser?.uid else { return }
let data: [String: Any] = [
"name": self.friendName1,
"uid": self.friendUid1
]
FireBaseManager.shared.firestore.collection("users").document(uid).collections("clients").document(self.friendUid1).setData(data) { error in
if let error = error {
print("DEBUG: Failed to store user info with error: \(error.localizedDescription)")
return
}
}
func addFriend2() {
guard let uid = FireBaseManager.shared.auth.currentUser?.uid else { return }
let data: [String: Any] = [
"name": self.friendName2,
"uid": self.friendUid2
]
FireBaseManager.shared.firestore.collection("users").document(uid).collections("clients").document(self.friendUid2).setData(data) { error in
if let error = error {
print("DEBUG: Failed to store user info with error: \(error.localizedDescription)")
return
}
}
func fetchFriends() {
guard let uid = FireBaseManager.shared.auth.currentUser?.uid else { return }
FireBaseManager.shared.firestore.collection("users").document(uid).collection("clients").getDocuments { snapshot, _ in
guard let documents = snapshot?.documents else { return }
self.friends = documents.compactMap({ try? $0.data(as: NewFriend.self) })
for i in 0 ..< self.friends.count {
self.matchingUid = self.friend[i].uid
print("print1: \(self.matchingUid)")
FireBaseManager.shared.firestore.collection("users")
.whereField("uid", isEqualTo: self.friendUid)
.getDocuments { snapshot, _ in
guard let documents = snapshot?.documents else { return }
self.clients = documents.compactMap({ try? $0.data(as: NewProspect.self) })
print("print2: \(self.matchingUid)")
}
}
}
}
}
struct ListView: View {
@ObservedObject var viewModel = AuthViewModel()
var body: some View {
List {
ForEach(viewModel.clients) { client in
Text(client.name)
.padding()
}
}
.onAppear {
viewModel.fetchFriends()
}
}
}
我可以在 print1 中打印兩個朋友的 uid,但是當涉及到 print2 時,只打印了一個 uid,並且列表只顯示了兩個朋友中的一個。 知道為什么會這樣嗎? 或者有沒有更好的方法讓這個 function 工作?
當您在 print2 之前獲取用戶時,您正在使用 where 子句進行獲取。
self.db.collection("users")
// This WHERE condition causes that only one friend will be found
.whereField("uid", isEqualTo: self.friendUid1)
.getDocuments { snapshot, _ in
guard let documents = snapshot?.documents else { return }
self.clients = documents.compactMap({ try? $0.data(as: NewProspect.self) })
print("print2: \(self.matchingUid)")
}
您示例中的那個( self.friendUid
)不是您的 AuthViewModel 的一部分,我假設您的意思是.whereField("uid", isEqualTo: self.friendUid1)
無論如何,那個 where 子句將您的結果限制為一個朋友(在這種情況下,只有friendUid1
的朋友。
也許你可以使用.whereField("uid", in: [self.friendUid1, self.friendUid2])
代替:
self.db.collection("users")
// In this case the WHERE condition cares about both friends
.whereField("uid", in: [self.friendUid1, self.friendUid2])
.getDocuments { snapshot, _ in
guard let documents = snapshot?.documents else { return }
self.clients = documents.compactMap({ try? $0.data(as: NewProspect.self) })
print("print2: \(self.matchingUid)")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.