我一直在阅读有关此问题的几个主题,但是似乎对我来说不起作用,这是一件“简单的”事情,但由于某种原因它却无法按正确的顺序工作。

我正在将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,因为可能不需要它-尽管这取决于用例。

08-08 00:10