为什么 numberOfRowsInComponent 函数 运行 这么多次?

Why is the numberOfRowsInComponent function ran so many times?

我的控制器中有一个 UIPickerView class,它会在用户触摸按钮时显示。

private var periodPicker = UIPickerView()

我有两个成分在里面好几年好几个月。

func numberOfComponents(in pickerView: UIPickerView) -> Int {
     return 2
}

现在我虽然 numberOfRowsInComponent 函数在开始时只有两次 运行 - 一次用于一个组件,第二次用于另一个 - 然后它可能是 运行 每当一个组件被重新加载。我没有重新加载我的两个组件中的任何一个,但是当我在 numberOfRowsInComponent 函数中插入打印时,我得到了这个输出:

函数:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        return years.count
    } else {
        print("numberOfRowsInComponent")
        loadMonths()
        return months.count
    }
}

输出:

numberOfRowsInComponent
numberOfRowsInComponent
numberOfRowsInComponent
<...>
numberOfRowsInComponent
numberOfRowsInComponent

我的函数是运行19次!这是 UIPickerView 的正常行为吗?因为如果不这样做可能会影响我的应用程序的性能,对吗?

不幸的是,您需要从事 UIKit 工作的 Apple 员工来告诉您原因。我可以告诉你的是,这似乎很正常。我拼凑了一个小示例项目,该项目没有做任何有趣的调查,似乎对这个函数的大量调用也发生在一个带有选择器视图的小视图控制器中,没有别的。

我会说这是否会影响您的应用程序的性能取决于您如何处理它被多次调用这一事实。这是否是正常行为并不重要,因为你我都无法修复它。但是,如果您不希望它影响性能,请不要在该函数中做繁重的事情。

如果 loadMonths 很重,如果您开始遇到性能问题,也许最好在其他地方做。

只是添加到@Christopher Thiebaut 的回答中,因为您想知道这些额外的调用是否会对性能产生影响。

我不确定为什么该方法被调用了 14 次,但我don't think如果数据源不更改,它会对性能产生与您想象的一样糟糕的影响:

A picker view fetches the value of this property from the data source and caches it. The default value is zero.