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

问题描述

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

var menu = [
    { id: 1,name: "Soda",price: 3.12,size: "4oz",type: "Drink" },{ id: 2,name: "Beer",price: 6.50,size: "8oz",{ id: 3,name: "Margarita",price: 12.99,size: "12oz",{ id: 4,name: "Pizza",price: 25.10,size: "60oz",type: "Food" },{ id: 5,name: "Kebab",price: 31.48,size: "42oz",{ id: 6,name: "Berger",price: 23.83,size: "99oz",];

var menu2 = [];  // creates a new array to hold the results 
for(var i = 0; menu[i]; i++){
    if(menu[i].price > 10) menu2[menu2.length] = menu[i]; // If an item has a price greater than 10 then I copy it to the new menu 
}

console.log(menu2); // display the new menu with the filtered data in the console 

我有两个组件可以用几年和几个月。

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
    }
}

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

解决方法

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

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

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

,

只是为了补充@Christopher Thiebaut 的回答,因为您想知道这些额外的调用是否会影响性能。

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

选择器视图从数据源中获取该属性的值 并缓存它。默认值为零。