【问题标题】:Custom UIView with Lazy Loading scrolls too slow具有延迟加载的自定义 UIView 滚动太慢
【发布时间】:2012-01-06 03:14:51
【问题描述】:

所以,我目前有一个 GridView 类,这基本上就是它听起来的样子。它是 UIView 的一个子类,它有一个暂存区域,其中有一堆子视图以类似网格的方式放置。 GridView 的每个单元格都是一个自定义 UIView 子类,它调用 drawRect。

我按照 UITableView 模式实现了延迟加载。我只加载并添加了可见的网格单元(每侧 +/- 2 个单元)。随着视图的滚动,我缓存了 NSMutableSet 中不再可见的单元格,并重用了该 Set 中的单元格来构建现在可见的单元格。一切似乎都运行良好,因为我已经对其进行了测试和分析,没有内存泄漏。

问题是滚动太慢/生涩。用户滚动得越快,它就越生涩。有时,如果滚动速度非常快,它会引发内存警告。经过一些调试工作,我发现当它开始冻结和抽搐时,gridview 中的子视图并没有被删除,就像它们应该的那样

我还注意到 iPad 1 上的滚动速度明显低于 iPad 2。

我的问题是,有人对如何处理这个问题有任何想法吗?任何技巧或优化来阻止滚动的生涩?在这一点上,任何事情都会有所帮助,因为我已经尝试了 2 天。提前致谢

【问题讨论】:

    标签: ios performance uitableview uiview lazy-loading


    【解决方案1】:

    可能的减速原因:1) drawRect 2) 在用户启用活动界面期间缓存

    选择 a) 预加载,然后呈现流畅的界面,或者 b) 在后台加载内容时平滑滚动,正在加载的空白区域?

    调试:你有没有试过在这个过程中做NSLog,比如每次缓存调用,看看是不是做了很多不必要的工作?

    【讨论】:

    • 感谢您的快速回复。 drawRect 正在绘制一个矩形并填充背景。在某些情况下,在另一个函数(不是 drawRect)中,它会创建另一个自定义 UIView(它又调用自己的 drawRect)并将其作为子视图添加。我认为这可能是一个问题,但是在对其进行分析之后,drawRect 并没有占用太多时间。至于选项 a),那是行不通的,因为我可以有一个巨大的网格,比如 1000 x 5,并且加载所有这些单元格可能需要 10 秒以上你能解释一下选项 b) 多一点吗?我不太确定我是否理解。
    • 这个想法是,如果您知道这 1,000 个对象所需的空间,您可以初始化每个对象及其占位符 gfx,而每个对象的内容的实际加载将取决于它是在屏幕上可见。一个例子可能是 alekseyn 的 easytableview。它似乎可以处理至少数百张没有明显故障的图像。我认为,相同的逻辑应该适用于自定义视图而不是图像。
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多