Как заставить метод инициализатора в классе ждать завершения Firestore в Swift 4? - PullRequest
0 голосов
/ 03 марта 2019

Я вызываю функцию, эта функция инициализирует класс, и в этом классе у меня есть метод initialize, который выполняет запрос к Firestore.У меня также есть переменная в этом классе, в которой, как только я закончу цикл по базе данных, я изменяю эту self.variable, чтобы она равнялась тому, что я только что создал.По какой-то причине я не могу завершить это, и когда я инициализирую свой объект класса, значение переменной никогда не меняется.

(Предположим, что класс пользователя состоит только из имени и возраста)

Здесь я вызываю свою функцию и инициализирую свой объект

fileprivate func fetch(){
    let homeObject = Home()
    print (homeObject.user.count)
    //count prints out as 0
    print (homeObject.test)
    //test prints out as 2 .. should be 3 but I'm not sure why?
}

Это класс для Home

class Home{
    var user: [User] = []
    var test = 1
    required init() {
        self.test = 2
        var userLoop = [User]()
        let db = Firestore.firestore()
        db.collection("users").getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    print("\(document.documentID) => \(document.data())")

                    let name_data = document.data()["name"]! as! String
                    let age_data = document.data()["age"]! as! String

                    let userTemp = User(name: name_data , age: age_data)

                    self.test = 3
                    userLoop.append(userTemp)
                }
                self.user = userLoop

            }
        }
    }

По какой-то причине test может измениться на число2, но я полагаю, что этот метод инициализатора не заканчивается, так как он не идет к номеру 3 (как вы видите выше, позже в функции инициализатора я изменяю его на номер 3).Я был бы очень признателен за помощь, застрял на этом в течение нескольких часов!

1 Ответ

0 голосов
/ 03 марта 2019

Инициализируйте Home блоком завершения, как показано ниже:

class Home{
    var user: [User] = []
    required init(with block: (Home)->Void) {
        var userLoop = [User]()
        let db = Firestore.firestore()
        db.collection("users").getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    print("\(document.documentID) => \(document.data())")

                    let name_data = document.data()["name"]! as! String
                    let age_data = document.data()["age"]! as! String

                    let userTemp = User(name: name_data , age: age_data)

                    userLoop.append(userTemp)
                }
                self.user = userLoop

            }
            block(self)
        }
    }
}

и вызовите его как:

var home = Home { (home) in
    //set your properties if needed.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...