我一直在阅读有关此问题的几个主题,但是似乎对我来说不起作用,这是一件“简单的”事情,但由于某种原因它却无法按正确的顺序工作。
我正在将Firebase中的数据检索到字典(EmployeesData)中,该视图在加载视图时已经有数据。 for循环将对象加载到“结果”中。但是以某种方式,如果表视图加载其数据,则“ Result.Employees”为空。因此,我了解了队列,尝试了一些解决方案,但所有结果都相同->'Result == nil'
我的问题是:为什么这不起作用?
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.global(qos: .background).async {
for x in self.EmployeesData{
self.Result.Employees?.append( Employee(
ID: x.value[self.Emp.ID] as? String,
FirstName: x.value[self.Emp.FirstName] as? String,
LastName: x.value[self.Emp.LastName] as? String,
PhoneNumber: x.value[self.Emp.PhoneNumber] as? String,
Address: x.value[self.Emp.PhoneNumber] as? String,
ZipCode: x.value[self.Emp.ZipCode] as? String,
Number: x.value[self.Emp.Number] as? String,
City: x.value[self.Emp.City] as? String,
DateOfBirth: x.value[self.Emp.DateOfBirth] as? Date,
Role: x.value[self.Emp.Role] as? String,
Email: x.value[self.Emp.Email] as? String,
workDays: nil)
)
}
self.tableView.register(EmployeeTableViewCell.self, forCellReuseIdentifier: self._View.EmployeeCell)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
在前一个控制器中设置了EmployeesData
Database.database().reference()
.child(Child.Employees)
.observeSingleEvent(of: .value, with: { (snapshot) in
if let empDict = snapshot.value as? [String:AnyObject]{
EmployeesDictionary = empDict
}
}) { (error) in
print(error)
}
我通过以下方式发送视图:
vc.EmployeesData = self.EmployeesDictionary
最佳答案
viewDidLoad中的代码在填充vc.EmployeeData之前运行。
将viewDidLoad中的代码移动到viewDidAppear或更好的方法-创建一个初始化程序,您可以将Dictionary传递给该初始化程序,该初始化程序还可以初始化并填充EmployeeData数组。
另外,该代码几乎应该是瞬时的,因此请删除DispatchQueue.main.async,因为可能不需要它-尽管这取决于用例。