属性 for picker 数据不会保留 for 循环的结果

Property for picker data won't retain result of for loop

我是 Swift 的新手,正在实现我的第一个 UIPickerView。如果我像 pickerData = ["item1", "item2"] 一样直接在 viewDidLoad 中设置 pickerData,它工作正常。但我需要从 Firebase 数据库构建选择器项目。

我能够使用一种从数据库中提取数据并创建列表的方法来构建选择器项目。然后我获取该列表并构建我的选择器项目。我可以打印数组,我看到数组构造正确。

但是当阵列完成后,它显然要么再次恢复为空,我的 pickerview 为空,要么我的 pickerview 在阵列完成之前设置,因此它为空。

我尝试在几个地方使用 Dispatch.main.async - 包括我的数据检索函数中的完成语句,围绕 pickerData 的构建等。我还尝试将整个代码用于数据pickerData 数组的检索和构造为 viewDidLoad,但它始终是相同的。 pickerData没有保留我为其构造的数组,pickerView为空

这是我的代码(写在Xcode 10,Swift 4.2),来自viewDidLoad

func viewDidLoad() {
    // Set up the pickerview
    ToyService.getToyList(kid: self.kid!) { (toyList) in
        self.pickerData.removeAll()

        // Go through each toy item and create a picker item from it

        for item in toyList {
            // Set up a formatter to work with the price as a string
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.minimumFractionDigits = 2
            formatter.maximumFractionDigits = 2

            let price = formatter.string(from: item.price!)
            let pickerItem:String = item.title! + " " + "($" + price! + ")"

            self.pickerData.append(pickerItem)

            print(self.pickerData)
        }

        print("here's the pickerdata: \(self.pickerData)")
    }

    print("here's the pickerdata again: \(self.pickerData)")
} // end of viewDidLoad

打印语句的输出如下(注意最后一个打印语句先打印,它打印的是一个空数组!):

here's the pickerdata again: []

["doll ([=20=].75)"]

["doll ([=20=].75)", "bear ([=20=].75)"]

["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)"]

["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]

here's the pickerdata: ["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]

您需要在完成中重新加载 pickerView,因为它是异步的

for item in toyList {   
  // ......
  self.pickerData.append(pickerItem)
  print(self.pickerData)
}
self.pickerView.reloadAllComponents()