ios - 如何让类中的初始化方法等待 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)。我非常感谢您的帮助,现在已经坚持了几个小时!
解决方案
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.
}
推荐阅读
- python - 如何修复 sqlalchemy.exc.NoForeignKeysError?
- date - 如何将 ISO 8601 日期标准化为当地时间?
- powershell - 是否可以使用 powershell 在存储帐户中创建 blob?
- excel - 尝试添加单元格时获取
- azure - 如何将 Azure AD 用作 SAML IdP?
- ansible - 如何将计算变量从一个 yml 文件分配给 Ansible 中的另一个 yml 文件?
- android - 适用于所有改装调用的 Moshi 通用适配器
- javascript - 我可以使用 TypeScript 类型对 Storybook 控件进行分组吗?
- python - 特定包构建不可用
- javascript - 如何过滤包含具有间隙键初始化的对象的数组