按顺序执行任务Swift

时间:2018-04-06 00:08:29

标签: swift firebase asynchronous synchronization queue

我一直在阅读有关这个​​问题的几个主题,但不知何故它似乎对我不起作用,这是一个“简单”的事情,但不知何故它不能以正确的顺序运作。

我正在从Firebase中检索数据到一个字典(EmployeesData),它在加载视图时已经有数据。(通过segue发送)在TableViewController中我希望将Dictionary数据放入一个对象(struct),所以我做一个for循环,它在'Result'中加载对象。但不知何故,如果tableview加载它的数据,'Result.Employees'为空。所以我读了一下队列,尝试了一些解决方案,但都产生了相同的结果 - > '结果== 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

1 个答案:

答案 0 :(得分:0)

在填充vc.EmployeeData之前,viewDidLoad中的代码正在运行。

将viewDidLoad中的代码移动到viewDidAppear或者更好 - 创建一个可以将Dictionary传递给它的初始化程序,同时初始化并填充EmployeeData数组。

此外,该代码应该几乎是即时的,因此删除 DispatchQueue.main.async ,因为它可能不需要 - 但这取决于用例。