Как мне сохранить данные Firestore в переменной, которой я могу манипулировать в Swift / Xcode? - PullRequest
0 голосов
/ 14 февраля 2020

Допустим, у меня есть переменная для целых чисел под названием currentShells

        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
                print("Document data: \(dataDescription)")

                let data = document.data()

                currentShells = data!["Shells"]! as! Int
            }
        }
        print(currentShells)

Когда я распечатываю переменную, я не могу. Swift заставляет меня добавить «self.currentShells» перед запросом, но в результате он не обновляет переменную. Как запросить данные из моей базы данных Firestore и использовать их в swift?

РЕДАКТИРОВАТЬ: Для большего контекста я хочу взять текущее значение в currentShells (который я хочу запросить из моего Firestore) и добавить фиксированный целое число на эту сумму и обновить его в моей базе данных

1 Ответ

2 голосов
/ 14 февраля 2020

Как сказал Дуг Стивенсон, getDocument выполняется асинхронно. Это означает, что

print(currentShells)

может (и в основном будет) выполняться до

currentShells = data...

. Изменение кода на

docRef.getDocument { (document, error) in
   if let document = document, document.exists {
      let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
      print("Document data: \(dataDescription)")

      let data = document.data()

      currentShells = data!["Shells"]! as! Int
      print("after update: \(currentShells)")
   }
}
print("probably before update: \(currentShells)")

должно распечатать обновленные данные.


Совет
Если вы не уверены на 100%, что установлен необязательный параметр определенного типа, не следует использовать неявное развертывание. Это может легко привести к сбоям! Безопаснее использовать guard или if let:

if let data = data, let shells = data["Shells"] as? Int {
    currentShells = shells
}

Редактировать
Для выполнения других функций с новым значением currentShells:
- если вам нужно выполнять одну и ту же функцию каждый раз, когда currentShells обновляется, обновите ваш var:

var currentShells: Int {
   didSet {
      yourFunc(currentShells)
   }
}

- в противном случае передайте блок завершения при вызове функции для обновления currentShells:

func getShells(completion: @escaping ((Int) -> ())) {
   ...
   docRef.getDocument { ...
      if let document ... {
         ...
         currentShells = ...
         completion(currentShells)
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...