Я испортил порядок моих обработчиков завершения и, скорее всего, также мой поток. Я использовал операторы печати и таймеры, чтобы проверить свою работу, и вот что я нашел:
- Промежуток времени составляет 0,00076 секунд, что явно не является предполагаемым поведением.
- Шаг 4 показан справа прочь, что опять-таки не является предполагаемым поведением.
- Показан шаг 1
- Показ шага 2 со временем 2,92 секунды, что нормально.
Единственная вещь исправить - это выполнить шаг 4 в самом конце, поскольку это будет означать, что шаги 1 и 2 выполнены.
Эта функция в классе A:
static func loadDataAndSignIn(completion: @escaping () -> () ) {
let start = Date()
Auth.auth().signInAnonymously { (result, error) in
if result != nil {
print("Step 1 -> Signed In. UserId is: \(result?.user.uid)")
Variables.getDataFromFirestore {
let end = Date()
print("Step 2 - > Data Fetched")
print("Data Fetched in \(end.timeIntervalSince(start)) seconds")
}
} else {
print(error?.localizedDescription ?? print("Sign in Error"))
}
}
DispatchQueue.main.async {
completion()
print("Step 4 -> Signed In and Data Loaded")
}
}
Эта функция также находится в класс A:
static func getDataFromFirestore(completion: (() -> Void)? = nil) {
let db = Firestore.firestore()
db.collection("Offences").getDocuments { (snapshot, error) in
if let error = error {
print("Error getting documents: \(error.localizedDescription)")
} else {
Variables.offencesArray.removeAll()
for offence in snapshot!.documents {
let offenceName = offence.get("name") as! String
let offencePoints = offence.get("points") as! Int
let offenceCost = offence.get("cost") as! Int
let offenceSection = offence.get("section") as! String
let offenceCategory = offence.get("category") as! String
let offenceObject = Offence(section: offenceSection, name: offenceName, cost: offenceCost, points: offencePoints, category: offenceCategory)
Variables.offencesArray.append(offenceObject)
}
}
DispatchQueue.main.async {
completion?()
}
}
}
Это viewDidLoad класса B:
let start = Date()
Variables.loadDataAndSignIn {
self.removeLoadingScreen()
let end = Date()
print("Time lapsed: \(end.timeIntervalSince(start))")
}
Нужна рука, чтобы вернуть мои блоки потоков / завершения в порядок.