#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 (переменная), зная это, вы можете сохранить данные из документа в переменной (с той же структурой) и присвоить ей другую переменную, а затем загрузить, я думаю, надеюсь, что это поможет.