主线程

时间:2015-08-27 09:33:28

标签: multithreading performance uitableview

我想知道是否有任何方法可以加速/加速UItableView / [重新加载数据]。

即使我使用以下方法在主线程上重新加载数据:

> [self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:No]

我仍然认为结果很慢(每次重新加载表时刷新2到3秒,如果用户不断刷新表,则会产生糟糕的用户体验)。

这里有一些背景知识,它目前是如何运作的。

1)我在苹果启动时从数据库中创建的数据创建了我的UITableView(直到这里没有问题,如果花几秒钟我就没事了。)

2)我点击表格视图中的一个项目,打开一个新屏幕来修改元素。

3)修改元素后,我更改了表视图的数据库,以便我更改的元素位于表视图的顶部。

4)当我按下屏幕上的后退按钮来更改我的元素时,我实现了UITableView的ViewWillAppear,并在主线程上重新加载数据。

5)我观察到的是从一个屏幕到另一个屏幕的延迟大约2/3秒。从我的代码中删除重新加载数据行,使转换瞬间完成。所以问题实际上在重装数据中。

我的UITableView的每一行都包含以下元素:

  • 来自文件的背景颜色(这基本上是渐变,文件大约是20Ko,它是PNG,文件存储在手机上)
  • 1或2个UIImageView(取决于我显示的状态)(每个约5Ko,非常小的PNG图标,文件存储在手机上)
  • 3 UILabel
  • 1 UIButton(在这个PNG里面,有一张图片,图片的原始大小可能从200到300ko不等,原始来源是来自互联网。我使用SDWebImage来加载/缓存它)

我认为我的每个单元格可能都有太多的信息,因为当我只有一行而不是10行时,我可以看到加载时间的巨大差异。

希望得到社区的一些意见,看看是否可以采取任何措施来改进。最好的是能够在后台更新UI,例如,当我修改我的元素时,我在后台重新加载数据,这样当我回到上一个显示UITableView的屏幕时,我的视图是已经刷新了,

由于

2 个答案:

答案 0 :(得分:1)

好的,我在这个网站上找到了解决方案:

http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks#drawing

20)优化您的表格视图 表格视图需要快速滚动 - 当它们没有时,用户真正注意到滞后。 为了使您的表格视图顺利滚动,请确保您已实施以下所有建议:

  • 通过设置正确的reuseIdentifier重用单元格。

  • 尽可能多地使视图不透明,包括单元格本身。

  • 避免使用渐变,图像缩放和屏幕外绘图。

  • 缓存任何行的高度(如果它们并不总是相同)。

  • 如果单元格显示来自Web的内容,请确保异步进行这些调用并缓存响应。 (关于这个问题的个人注释,因为这是我的问题:看看这个解释如何在UITableView中使用SDWebImage的其他网站http://keighl.com/post/sdwebimage-uitableviewcell/。非常有用。

  • 使用shadowPath设置阴影。

  • 减少子视图的数量。

  • 在cellForRowAtIndexPath中尽可能少地工作:如果您需要做一些工作,只需执行一次并缓存结果。

  • 使用适当的数据结构来保存您需要的信息。不同的结构对不同的操作有不同的成本。

  • 使用rowHeight,sectionFooterHeight和sectionHeaderHeight设置常量高度,而不是询问代表。

答案 1 :(得分:0)

你说"背景颜色来自文件" - 这提醒我你正在进行IO工作,这通常非常耗时,如果你在显着提高速度的情况下从文件中加载了一种颜色,我很好奇吗?