Завершение / помощь в оформлении заказа - PullRequest
1 голос
/ 08 апреля 2020

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

  1. Промежуток времени составляет 0,00076 секунд, что явно не является предполагаемым поведением.
  2. Шаг 4 показан справа прочь, что опять-таки не является предполагаемым поведением.
  3. Показан шаг 1
  4. Показ шага 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))")
    }

Нужна рука, чтобы вернуть мои блоки потоков / завершения в порядок.

1 Ответ

1 голос
/ 09 апреля 2020

Поместите ваш вызов в completion внутри обработчика завершения getDataFromFirestore, который находится внутри обработчика завершения signInAnonymously:

static func loadDataAndSignIn(completion: @escaping () -> () ) {
    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")

                DispatchQueue.main.async {
                    completion()
                    print("Step 4 -> Signed In and Data Loaded")
                }
            }
        } else {
            print(error?.localizedDescription ?? "Sign in Error")
        }
    }
}

Примечание: вы можете захотеть также завершить вызов, если result от звонка до signInAnonymously равно нулю, как:

[...]
        } else {
            print(error?.localizedDescription ?? "Sign in Error")

            DispatchQueue.main.async {
                completion()
            }
        }
...