Как сказал Дуг Стивенсон, 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)
}
}
}