У меня есть класс UserData, который установлен как EnvironmentObject, который собирает данные текущего пользователя из Firestore и сохраняет их в publi c var. Теперь, чтобы сделать заказ, я хочу загрузить товары, которые предлагает каждый продавец, но для этого мне нужно получить, какого продавца мой пользователь выбрал из базы данных Firestore.
Я вызвал класс UserData в моем классе readDrinksFromDb , но в моей функции init (), где я загружаю товары продавца, UserData просто не показывает никакого значения и просто пуста, я не могу получить какую-либо информацию, а когда я ее распечатываю, консоль просто печатает новую строку .
Как заставить UserData работать в другом классе? Потому что, как кажется, класс инициализации появляется еще до того, как он инициализирует указанные выше переменные.
Он также дает мне ошибку, когда я пытаюсь вызвать этот класс: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but drinks has 1'
потому что UserData просто пуста и не может быть извлечен, поэтому он вообще не указывает на документ, но я пытаюсь получить данные из этого документа.
class UserData: ObservableObject {
static let shared = UserData()
@Published var user = User(id: "", name: "", email: "", account: "", reserviert: "", customerID: "")
init () {
let db = Firestore.firestore()
guard let userID = Auth.auth().currentUser?.uid else {
print("No user")
return
}
let userData = db.collection("users").document(String(userID))
userData.addSnapshotListener(includeMetadataChanges: true) { (snap, err) in
guard let document = snap else {
print("Document does not exist")
return
}
guard let data = document.data() else {
print("Document was empty")
return
}
self.user = User(id: data["uid"] as! String, name: data["Name"] as! String, email: data["E-Mail"] as! String, account: data["account"] as! String, reserviert: data["reserviert"] as! String, customerID: data["customerID"] as! String)
}
}
func update() {
let db = Firestore.firestore()
guard let userID = Auth.auth().currentUser?.uid else {
print("No user")
return
}
let userData = db.collection("users").document(String(userID))
userData.addSnapshotListener(includeMetadataChanges: true) { (snap, err) in
guard let document = snap else {
print("Document does not exist")
return
}
guard let data = document.data() else {
print("Document was empty")
return
}
self.user = User(id: data["uid"] as! String, name: data["Name"] as! String, email: data["E-Mail"] as! String, account: data["account"] as! String, reserviert: data["reserviert"] as! String, customerID: data["customerID"] as! String)
}
}
}
class readDrinksFromDb: ObservableObject {
@Published var items = [Item]()
@ObservedObject var userInfo = UserData()
init () {
let db = Firestore.firestore()
let itemsRef = db.collection("drinks")
// let loungeRef = itemsRef.document("XYZ Lounge")
let loungeRef = itemsRef.document(userInfo.user.reserviert) // Should get the lounge Name -> XYZ Lounge
loungeRef.getDocument { (snap, err) in
if let err = err {
print(err.localizedDescription)
return
}
guard let snap = snap else { return }
guard let dict = snap.data() else { return }
dict.forEach { i in
let orderItems = dict[i.key] as! [String: String]
let id = orderItems["id"] ?? ""
let price = orderItems["price"] ?? ""
let pic = orderItems["pic"] ?? ""
let name = orderItems["name"] ?? ""
self.items.append(Item(id: id, name: name, price: price, pic: pic, lounge: "XYZ Lounge", type: "drinks"))
}
print(self.items)
}
}
}