如果您按原样使用 LazyTableImages 代码,那是正常的。加载被推迟到滚动结束。在我的测试应用程序(一个简单的类似 instagram 的流)中,我使用了一种不同的方法:基本上我将单元格子类化,从单元格本身开始下载,使用单元格作为我的下载管理器的代表,然后更新单元格的 UI下载完成时
详细地
- 我在 cellForRowAtIndexPath 方法中开始下载(如果视图正在滚动,LazyTableImages 会延迟下载,我不这样做,因为对我来说可以在滚动时加载)调用我的单元格的“startDownload”方法。
- 我的单元子类设置为我的下载管理器的代表,当下载完成时,单元格用真实图像更改占位符(这是在自定义的“downloadManagerDidFinishDownloadForImage:(UIImage*)image”委托方法中完成的,在细胞亚类)
- 在我的单元子类中,我重写了 prepareForReuse 方法。在这里,如果要重复使用单元格,我可以选择停止下载。就我而言,我只是取消设置委托并继续下载,因为我有一些使用核心数据进行的图像缓存,我希望缓存继续进行。
此外,您必须注意两件事:
- 您的下载管理器需要在后台线程中工作
- 请务必在主线程中更新您的单元格 UI。您可以使用
:
dispatch_async(dispatch_get_main_queue(), ^{
//update here your cell UI
});
在委托方法中(如果该方法由您的下载管理器调用,它肯定会在后台线程中调用,因此您必须使用调度“在主线程中“移动”)。
如果你愿意,你可以看看我的例子,但它是“原样”(它是一个测试应用程序,有很多意大利面条代码和与你的问题无关的东西;-)
http://www.lombax.it/documents/InstaXplore.zip
在我的示例中,您必须查看:
- BrowseCell <-- 单元子类
- BrowsePhotoViewController <-- 表格视图控制器
其他的东西都和核心数据存储和instagram有关,但基本上
- 在 cellForRowAtIndexPath 我创建一个新单元格(或重用以前的单元格)并传递一个 InstaImage 项目(我的自定义图像)
- InstaImage 检查是否存在缓存副本,如果不存在,则开始下载,然后提醒单元格
你有一个清晰的缓存按钮可以一次又一次地尝试:-)