4

简短的问题是:我们是否可以强制tableView:cellForRowAtIndexPath调用“未显示的单元格”(例如,单元格 8 到 25),以便我们从服务器预获取图像,并且如果表格只有 20 或 25 行,则永远不会重用单元格?


细节:我认为 的机制tableView:cellForRowAtIndexPath主要是为了保留内存,尤其是在 iPhone 或 iPod Touch 上,这样如果一个表有 1000 行,就不会有 1000 个UITableViewCell对象(UITableViewCell是 的子类UIView),这会使用很多内存,但只有 10 个左右的对象,而且这些对象可以“重用”,因此内存使用可以保持在较小的大小。

但是,如果每一行都在服务器上获取了一张图片呢?与其用单独的线程构建单独的图像缓存,我们可以让我们tableView:cellForRowAtIndexPath获取前 7 个图像并显示表格,然后强制渲染单元格 8 到 25,并且从不调用dequeueReusableCellWithIdentifier(所以我们有 25 个这样的UITableViewCell对象和不要重复使用它们)。如何做到这一点,它实际上是一个实用且简单的解决方案吗?

4

4 回答 4

6

缓存图像几乎不属于视图层;也不会从服务器检索这些图像。

您应该采用您在帖子中描述的方法 - 将图像与表分开缓存,然后从该图像缓存中检索这些图像。

您可以构建一个ImageProvider根据其键为您提供图像的类,并使用该提供程序来构建表格单元格。反过来,ImageProvider决定是从服务器加载图像还是从缓存加载它们,从表视图中隐藏细节。

这种方法为您提供了很大的灵活性:如果您决定通过在设备上本地缓存图像来节省网络流量,使用单独缓存的方法可以让您在不干扰视图层的情况下做到这一点。它还允许您通过将缓存的图像刷新到临时文件来节省内存,例如,在收到内存不足警告时。

于 2012-08-23T20:20:02.863 回答
0

你不能强迫UITableViewto 打电话tableView:cellForRowAtIndexPath

我能想到的解决方法是UITableViewCell提前创建实例,将它们存储在一个NSArraytableView:cellForRowAtIndexPath返回您已经创建的实例,索引预先创建的行数组。

于 2012-08-23T20:08:45.800 回答
0

与加载所有单元格相比,预取所需的所有图像要好。我建议为此目的使用SDWebImage。它还包括一个图像预取器,您可以使用它在显示 UITableView 内容之前加载所有图像。

于 2012-08-24T03:09:14.050 回答
0

虽然这是一个糟糕的想法,但可以通过创建一个与表格一样大的 UIScrollView,然后添加一个禁用滚动的 UITableView 来做到这一点。

CGSize tableSize = CGSizeMake(320, 1000);
UIScrollView* aScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableSize.width, tableSize.height)];

UITableView* aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, tableSize.width, tableSize.height)];
aTableView.scrollEnabled = NO;
[aScrollView addSubview:aTableView];
[aTableView release];

[self.view addSubview:aScrollView];
[aScrollView release];
于 2012-08-23T21:26:08.930 回答