Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.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
Iphone 带有扭曲的UIScrollView延迟加载策略_Iphone_Uiscrollview_Lazy Loading - Fatal编程技术网

Iphone 带有扭曲的UIScrollView延迟加载策略

Iphone 带有扭曲的UIScrollView延迟加载策略,iphone,uiscrollview,lazy-loading,Iphone,Uiscrollview,Lazy Loading,我有一个水平滚动的UIScrollview,启用了分页功能。每个页面代表一个数据提要。每个数据源都会消耗相当大的内存,包括UITableView中显示的文本和图像。因为用户可以有无限量的数据源,所以我需要延迟加载它们,以防止最大限度地使用内存。我的想法是在任何给定点在内存中保留多达5个数据源,并释放超出该范围的任何内容。我最初的做法是将视口中的页面保留在内存中,并将两个页面放在其两侧。这样,当用户滚动时,下一个连续页面将始终在内存中,并将快速显示 我的问题是: 我们还需要支持这样一种场景:用户可

我有一个水平滚动的UIScrollview,启用了分页功能。每个页面代表一个数据提要。每个数据源都会消耗相当大的内存,包括UITableView中显示的文本和图像。因为用户可以有无限量的数据源,所以我需要延迟加载它们,以防止最大限度地使用内存。我的想法是在任何给定点在内存中保留多达5个数据源,并释放超出该范围的任何内容。我最初的做法是将视口中的页面保留在内存中,并将两个页面放在其两侧。这样,当用户滚动时,下一个连续页面将始终在内存中,并将快速显示

我的问题是: 我们还需要支持这样一种场景:用户可以跳到特定的数据提要,可能在右边或左边有10个或更多页面,这会将我的整个延迟加载方案抛到窗外


是否有更好的策略来支持此场景?

是的,您可以创建一个外部滚动视图,其中包含类似于tableview的单个单元格。在这方面,单元格有一个内容视图,您可以在其中放置数据,我们假设您知道如何这样做,因为您似乎知道

一旦你有了这种架构,它就变得相当清楚了:你可以,知道你的单元格的宽度和屏幕的大小,一些简单的数学可以告诉你屏幕上有多少个,你可以在左边或右边添加一个,这样你就可以在用户滚动时预加载一些数据

也就是说,如果在scrollview的内容视图的开始或结束处有3个feed,那么您可以在内存中最多有5个feed,4个feed,而不管您是否有10亿个feed

其中一个关键部分是单元重用。您维护了一对
NSSet
s,一个用于回收单元,一个用于可见单元。将屏幕外的项目添加到回收的单元格中,在设置单元格时将项目从回收的单元格中移出,以节省额外的内存分配,这可能会很昂贵。请记住,在使用此策略时,在单元重用方面,您仍然受到与
UITableView
相同的警告的影响

我正在插入我在这里写的一些软件,所以请原谅我,但我这样做是作为我所说的一个例子,如果你在实现我在这里讨论的内容时遇到困难,它是可用的


最后一个音符。要支持跳过单元格,只需再次进行简单的数学运算即可调整滚动视图中的点。这方面的操作可以通过手势来完成,不过现在我们讨论的是一个泛手势识别器,例如,它具有一些特定于应用程序的特定属性。或者,如果您确实需要,也可以使用按钮。只需确保您知道如何计算到单元格的偏移量,然后滚动到该点即可。你会没事的。

用问题中提供的信息很难给出准确的建议。因此,我将仅介绍我在阅读问题时的一些想法

下载提要需要很长时间吗?是否可以只下载几个项目(一个完整的屏幕)就可以立即显示前几个项目?如果可能的话,可能会延迟加载图像

您是否考虑过在磁盘上缓存提要数据?这样,您可以立即呈现一些数据,然后在下载新数据时更新提要

由于每个页面都是一个提要视图,用户是否只需滚动浏览提要而不查看它?你真的需要在每一边加载两个视图吗?或者你能在每一边只加载一个视图吗

我不认为您的延迟加载方案会因为用户可以直接跳到任何页面而停止工作。当选择该页面时,您必须开始加载该页面的数据,但使用磁盘缓存或下载小样本可能会让应用程序感觉更快。我还认为,使用某种动画对所选页面进行动画制作可以为您赢得一点时间

这是我的问题:我们还需要支持这样一种场景:用户可以跳到一个特定的数据提要,可能在右边或左边有10个或更多页面,这会将我的整个延迟加载方案抛出窗口

然后,您需要修复数据结构。我写的几乎就是这个(一个类似分页滚动视图的UITableView),它工作得很好(有一些重新加载的怪癖,但是嘿…)

  • 跟踪已加载的页面。我使用了一个类似于模8的环形缓冲区,并花了一段时间来获得正确的代码;只使用带有NSNumber键和UIView值的NSDictionary可能会容易得多。这意味着当您从第1页更改为第10页时,仍然可以判断加载的视图是针对第1、2和3页的,并将其删除
  • 在-layoutsubview中加载所需的页面。我会加载1或3;5可能太多(但如果在两页之间,则至少需要加载2页)
  • -scrollViewDidScroll:
    中加载3(每侧一个)。这样,当您从第1页滚动到第2页时,它不会尝试加载第4页(尚未加载)
  • –ScrollViewDiEndDraging:WillDecreate:
    中加载5(两侧各两个),如果WillDecreate为否,
    –ScrollViewDiEndDecreating:
    –scrollViewDidScrollToTop:
    ,和
    –ScrollViewDiEndScrollingAnimation:
    。这个想法是动画结束了,因此您可以加载额外的视图,而不会让用户感觉到延迟
  • 可能在
    中加载5–ScrollViewWillBeginDraging:
    ,以确保在当前处于第1页时加载第3页
我决定做“两边各两页”,因为当你从第1页弹到第2页时,它通常会在反弹时显示第3页的一个像素宽的小条。使用滚动视图插入可以避免这种情况,但我们当时没有想到(oops)。除此之外,没有太多理由选择5而不是3

这是一个有点工作,以得到正确的,但在其他方面似乎是正确的