具有 UIPageControl 性能问题的自定义 UIScrollview

Posted

技术标签:

【中文标题】具有 UIPageControl 性能问题的自定义 UIScrollview【英文标题】:Custom UIScrollview with UIPageControl Performance Issues 【发布时间】:2012-04-30 01:20:00 【问题描述】:

我有一个有 24 页的 UIPageControl。每个页面都有一个 UITableView。用户可以按下屏幕顶部的按钮来刷新数据(全部 24 页)。

在所有页面上调用 reloadData 会导致 3 秒延迟,但数据会刷新,并且它们可以滚动 UIPageControl 并查看新数据。在当前页面上调用 reloadData 速度很快,但只会更新相关页面。当用户转到下一页时,数据是旧的/错误的。

我的“修复”是实现一个系统,在用户滚动到页面之前,我在页面上调用 reloadData,一次一个,并跟踪哪些页面是新的,哪些不是。

在具有相对大量页面的 UIPageControl 情况下,这是正确的方法,还是我滥用 UIPageControl、使用不正确的方式刷新页面或其他方式。

非常感谢您对解决此性能问题的建议。

谢谢。

【问题讨论】:

【参考方案1】:

我不确定您所描述的是否是最佳实践,但我会假设您知道自己在做什么并且已经找到了可行的解决方案(并非所有人都会假设)。

根据您的评论/问题,我不太确定,但您似乎已经在尝试仅以惰性方式动态加载数据。如果是这样的话,我可能没有什么要补充的,但这里有一些想法:

    在 Apple UIPageControl 示例中,每次 UIScrollView 委托调用其scrollViewDidScroll: 方法时,它们都会加载当前页面、上一页和下一页(当然,处理第一页和最后一页的情况上一个/下一个可能不存在的地方)。也许您可以通过这种方法调用[tableView reloadData]

    如果您发现每次页面加载时都必须加载所有 24 个,也许您可​​以立即调用 [tableView reloadData] 然后遍历其他页面,一次重新加载它们的数据,等待一页完成在加载下一个之前。

数字 1 似​​乎是一种可以更快地准备好数据的优雅方式。 2 号对我来说是一个非常笨拙的 hack,所以我真的想看看 1 号是否可行。

【讨论】:

感谢您的回答并确认我的想法。我还没有实施延迟加载,但没有检查以确认这是正确的方法,并且我当前的“解决方案”(即加载所有内容)不是最好的方法。感谢您的周到回答。【参考方案2】:

不要同时加载 24 个页面。由于用户一次只能看到一个页面,因此一次加载所有页面只是浪费资源。您应该检测用户所在的当前页面并仅重新加载该页面。如果您依赖 UIPageControl 切换页面,请让您的代理监听事件

 UIControlEventValueChanged 

并加载您的下一页。如果您使用的是 UIScrollView,您还可以使用它的委托方法来检测更改并重新加载相应的页面。

【讨论】:

再次感谢您的回答。就像 mbm30075 一样,您是正确的,我很欣赏您的回复。

以上是关于具有 UIPageControl 性能问题的自定义 UIScrollview的主要内容,如果未能解决你的问题,请参考以下文章

iOS6 UICollectionView 和 UIPageControl - 如何获得可见单元格?

GridSearchCV上的自定义评分,具有折叠相关参数

在 iPad 上具有多个可查看页面的 UIPageControl

.NET 中的自定义 ORM

自定义 UIPageControl 的位置

UIPageControl 自定义类 - 发现 nil 将图像更改为点