Используйте класс Firebase в init () другого класса - PullRequest
0 голосов
/ 26 мая 2020

У меня есть класс 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)
    }

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...