Как сохранить (в переменной) данные документа Firestore, которые были прочитаны из базы данных в Xcode

#ios #swift #firebase #google-cloud-firestore

#iOS #swift #firebase #google-облако-firestore

Вопрос:

Я пытаюсь прочитать данные из Firebase Firestore, но нет способа сохранить данные документа в переменной, потому что эти переменные будут просто локальными и будут «собраны для мусора»

Я попытался создать функцию, которая пытается вернуть содержимое документа, но это привело к ошибке, потому что метод «getDocument» не допускает возвращаемый тип.

 docRef.getDocument { (document, error) in
    if let document = document, document.exists {
        let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
        var dataValues = document.data()!.values
        self.textInput = dataDescription
        //I first tried doing it without the word self, but it gave an error insisting that I add self, but adding it makes it a local variable and not the String variable defined in the class
        //textInput is a String
        print("Document data: (document.data()!.values)")
        //This will print out everything in the document
    } else {
        print("Document does not exist")
    }
}
  

Я пытаюсь выяснить, могу ли я установить какую-либо переменную для данных документа и по-прежнему иметь доступ к данным после чтения базы данных.

Ответ №1:

Я предлагаю вам взглянуть наhttps://firebase.google.com/docs/firestore/manage-data/transactions У Firebase есть одна из самых полных документации, это поможет вам, если быть точным, вы должны сделать это следующим образом:

 let sfReference = db.collection("cities").document("SF")

db.runTransaction({ (transaction, errorPointer) -> Any? in
    let sfDocument: DocumentSnapshot
    do {
        try sfDocument = transaction.getDocument(sfReference)
    } catch let fetchError as NSError {
        errorPointer?.pointee = fetchError
        return nil
    }

    guard let oldPopulation = sfDocument.data()?["population"] as? Int else {
        let error = NSError(
            domain: "AppErrorDomain",
            code: -1,
            userInfo: [
                NSLocalizedDescriptionKey: "Unable to retrieve population from snapshot (sfDocument)"
            ]
        )
        errorPointer?.pointee = error
        return nil
    }

    // Note: this could be done without a transaction
    //       by updating the population using FieldValue.increment()
    transaction.updateData(["population": oldPopulation   1], forDocument: sfReference)
    return nil
}) { (object, error) in
    if let error = error {
        print("Transaction failed: (error)")
    } else {
        print("Transaction successfully committed!")
    }
}
  

как описано в документации Firebase.

Комментарии:

1. Я знаю о транзакциях, но я пытаюсь присвоить переменную данным, которые я только что прочитал. Всякий раз, когда я пытаюсь присвоить переменную данным, считанным из базы данных, она выдает ошибку и настаивает на добавлении ключевого слова «self», которое создаст новую переменную и будет «собрано мусором» после завершения чтения базы данных. В случае, если моя формулировка была плохой, мой вопрос: есть ли какой-либо способ присвоить переменную данным, которые я прочитал из Firebase Firestore

2. Честно говоря, я не очень хорошо знаю swift, но когда я загружаю документ, я делаю doc.getDocument().ToObject(nameClass.class ) и получить переменную с данными (класс должен иметь ту же структуру документа), а затем я загружаю непосредственно переменную с помощью .set (переменная), зная это, вы можете сохранить данные из документа в переменной (с той же структурой) и присвоить ей другую переменную, а затем загрузить, я думаю, надеюсь, что это поможет.