Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 注册我不知道的单元格是否有很大的性能影响';我没用?_Ios_Swift_Swift3 - Fatal编程技术网

Ios 注册我不知道的单元格是否有很大的性能影响';我没用?

Ios 注册我不知道的单元格是否有很大的性能影响';我没用?,ios,swift,swift3,Ios,Swift,Swift3,我将我的uitableviewcell放在单独的XIB中,因为我在整个应用程序中大量重用它们。现在,我在每个UITableViewController中都有一个要注册的单元格列表,如下所示: // viewdidload tableView.register(UINib(nibName: "KeyTextCell", bundle: nil), forCellReuseIdentifier: "KeyTextCell") tableView.register(UINib(nibN

我将我的
uitableviewcell
放在单独的XIB中,因为我在整个应用程序中大量重用它们。现在,我在每个
UITableViewController
中都有一个要注册的单元格列表,如下所示:

// viewdidload
    tableView.register(UINib(nibName: "KeyTextCell", bundle: nil), forCellReuseIdentifier: "KeyTextCell")
    tableView.register(UINib(nibName: "KeyValueCell", bundle: nil), forCellReuseIdentifier: "KeyValueCell")
    tableView.register(UINib(nibName: "KeyEditFieldCell", bundle: nil), forCellReuseIdentifier: "KeyEditFieldCell")
    tableView.register(UINib(nibName: "KeyTwoEditFieldCell", bundle: nil), forCellReuseIdentifier: "KeyTwoEditFieldCell")
    tableView.register(UINib(nibName: "KeyThreeEditFieldCell", bundle: nil), forCellReuseIdentifier: "KeyThreeEditFieldCell")
    tableView.register(UINib(nibName: "KeySwitchCell", bundle: nil), forCellReuseIdentifier: "KeySwitchCell")
    tableView.register(UINib(nibName: "TextCell", bundle: nil), forCellReuseIdentifier: "TextCell")

//cellForRow...
    let cell = tableView.dequeueReusableCell(withIdentifier: "KeyValueCell") as! KeyValueCell
我必须先在这个列表中添加新的单元格,然后才能使用控制器中的单元格,这很烦人,也很容易忘记。除此之外,在我的viewDidLoad中有一个要注册的单元格列表是很难看的,在某些地方它会变得很长。

所以我想让它变得更好。我正在考虑在
UITableViewController
扩展中创建一个小函数,用于注册我拥有的所有单元格。这意味着只需要维护一个列表,还需要在特定的控制器中注册我可能不需要的单元格。注册不必要的单元格是否会对性能造成(很大)影响?还有其他缺点吗?什么是最佳实践?

这将花费您两种方式—在注册所有NIB时在viewDidLoad时间,以及在
表格视图(uu:cellForRowAt:)
中创建/回收单元格

1。在viewDidLoad中

让我们详细看一下这行:

tableView.register(UINib(nibName: "KeyTextCell", bundle: nil), forCellReuseIdentifier: "KeyTextCell")
这里有两件事:

  • 创建
    UINib
    对象
  • 创建一个
    UINib
    非常快,它甚至不会检查nib是否存在,直到您请求它的内容。您可以使用以下代码进行测试:

    let nib = UINib(nibName: "Doesn't exist", bundle: nil)
    print(nib) // Prints out something like `<UINib: 0x60000001fba0>`
    
    // This line will load the nib and unpack it into the view.
    // It's obviously going to fail :)
    let view = nib.instantiate(withOwner: nil, options: [:])
    
    让nib=UINib(nibName:“不存在”,bundle:nil)
    打印(笔尖)//打印出如下内容``
    //此行将加载nib并将其解压缩到视图中。
    //它显然会失败:)
    让view=nib.instantiate(withOwner:nil,options:[:])
    
    此外,阅读UINib的文档会告诉您它只从磁盘加载一次内容并缓存它,因此无论您从nib创建一个单元格多少次,您只需要在第一次需要时访问它

  • 在表视图中注册它
  • 这相当于在字典中插入一个条目——考虑到你的字典有多小(7个条目?),这会很快。所以我不必担心注册时间(不过,您应该测试一下,见下文)

    2。在
    表格视图中(\uuxCellFrorrowat:)

    表格视图(uu1;:cellFrorRowAt:)
    中创建/出列单元格怎么样?我们可以忽略现有单元的出列-这与从nib加载单元无关-该单元已经加载并在内存中-因此我们关心的是当您请求一个单元,但没有一个可以回收时。考虑到表视图的平均高度,对于第一个满是行的屏幕,这种情况将发生10-15次。之后,他们将开始回收

    如果我们假设TableView将它们的NIB存储在类似于字典的东西中,这将是非常快的-字典访问是O(1),所以不管注册多少个单元格。但是,如果将其存储为类似数组或集合的内容,则随着添加更多项,访问速度会变慢,但您只添加了7项,因此仍然非常快:)

    3。测试所有这些

    这主要是猜测——找出影响的最佳方法是在真实设备上测试(选择客户可能使用的最差设备!)

    测试这一点最糟糕的方法是只注册10000个NIB(在viewDidLoad中写一个循环),然后看看你的应用程序是如何运行的。如果10000没问题,那么7;)也没问题

    测试这一点的最佳方法是使用仪器对其进行评测-按CMD-i(而不是CMD+r)在仪器中运行代码,仪器将打开。选择“时间档案器”并按下左上角的红色记录按钮-这将运行你的应用程序,但会记录发生的所有方法调用等。让应用程序启动并稳定下来(当你的应用程序启动时,活动图将变为精神状态,然后当你的应用程序坐在那里等待你与之交互时,活动图将变为空白)。然后,您可以导航到所有这些nib都已注册的视图控制器,您可以看到打开视图控制器需要多少活动,以及滚动等需要多少活动。只注册一个nib时尝试此操作,注册10000时尝试此操作以查看差异

    您还可以在屏幕的下半部分看到按时间划分的函数调用-如果您在其中单击,您可以找到有关哪些调用花费了很长时间的有用信息

    希望这是有帮助的-有一大堆更有用的东西,仪器可以做-它值得有一个点击左右,看看什么是可用的。这里有文档:

    另一个要考虑的事情是记忆——如果你在你的所有表格视图中注册所有这些笔尖,那么你可能会使用你不需要的内存,但是我会再次在仪器中显示这一点,看看它是什么。我的直觉是,你不必担心,UINib只加载它需要的东西,我打赌当低内存警告到来时,UINib会清除它的缓存:)


    tl;dr I如果你的应用程序滚动顺畅,我不会担心7个笔尖。

    你可以自己轻松测试。试试看@你能告诉我如何可靠地测试这个吗?我来这里是因为我自己不知道如何测试(记住可伸缩性等)测量从重新加载数据到显示的所有单元格所花费的时间(即cellForRowAt被称为dataSource.count times)。只注册使用过的单元格XIB,一次注册一堆未使用的XIB。比较测量值以确定是否存在显著的增量。您可以定义自己的协议来优化代码,如下所示: