首页 > 解决方案 > 如何让类中的初始化方法等待 Firestore 在 Swift 4 中完成?

问题描述

我正在调用一个函数,该函数初始化一个类,并且在该类中我有一个初始化方法,该方法向 Firestore 发出请求。我在那个类中也有一个变量,一旦我完成了对数据库的循环,我将这个 self.variable 更改为等于我刚刚创建的任何内容。出于某种原因,我无法完成此操作,并且当我初始化我的类对象时,变量的值永远不会改变。

(假设 User 类只包含姓名和年龄)

这是我调用函数并初始化对象的地方

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?
}

这是家庭课程

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)。我非常感谢您的帮助,现在已经坚持了几个小时!

标签: iosswiftfirebasegoogle-cloud-firestoreswift4

解决方案


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.
}

推荐阅读