Apple 在导航控制器中延迟加载图像,恢复为占位符图像
Posted
技术标签:
【中文标题】Apple 在导航控制器中延迟加载图像,恢复为占位符图像【英文标题】:Apple Lazy Loading Images within a nav controller, reverts back to placeholder images 【发布时间】:2011-09-01 20:01:48 【问题描述】:我实现了 Apple 的 LazyTableImages 项目 (link),但在我的版本中,我使用 RestKit 来获取数据,并且我的 UItableviewcontroller 被推送到导航堆栈上。
所以我避开了苹果在应用程序委托中执行的任何操作来获取 xml。我不认为这是问题所在。我的问题是,当您使用导航返回按钮或访问另一个选项卡栏项目并返回时退出 UITableviewcontroller 时,之前加载的图像会显示出来,但它会立即加载占位符图像。基本上,情况正好相反。
这就像 UITableview 缓存的数据,所以当你回来时它会干扰 Lazy Table Images。我需要知道有没有人在他们不得不退出的地方实现了这个代码?
编辑:
看起来 imageDownloader 第二次不为零,这会阻止图像加载。我仍在研究如何绕过它。当然,我可以直接取出条件,但我不知道这是否对性能“不利”。
imageDownloadsInProgress 是一个可变字典,即使您退出,它仍然拥有它的所有数据。现在它已成为一个不同的问题,如果用户回击或偏离当前视图,我如何删除 imageDownloadsInProgress。
imageDownloadsInProgress 被保留,但我在 dealloc 方法中添加了 [imagesDownloadsInProgress release],但我认为它不会运行。
-(void)startEventImageDownload:(WhatsonEvent *)eventRecord forIndexPath:(NSIndexPath *)indexPath
EventImageDownloader *imageDownloader = [imageDownloadsInProgress objectForKey:indexPath];
if(imageDownloader == nil)
NSLog(@"%@",eventRecord.title);
imageDownloader = [[EventImageDownloader alloc] init];
imageDownloader.eventRecord = eventRecord;
imageDownloader.indexPathInTableView = indexPath;
imageDownloader.delegate = self;
[imageDownloadsInProgress setObject:imageDownloader forKey:indexPath];
[imageDownloader startDownload];
[imageDownloader release];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
【问题讨论】:
【参考方案1】:我这样做的方式是建立自己的缓存并将图像保存在用户文档目录中。当我调用[tableView reloadData]
时(你在调用它,对吗?),它首先检查每个单元格是否存在本地图像,否则它会从提要中懒惰地加载它们。告诉我你是否需要这方面的代码。
【讨论】:
如果您使用自己的东西,这可能是处理它的最佳方法。我个人使用 EGOImageLoader (google it) 和随附的 EGOCache,它运行良好。 无论如何 - 你可以在你的viewDidAppear
方法中调用 reloadData
- 这应该可以解决它。
谢谢,我刚刚尝试过,它仍在发生。我不明白,当我退出时,我的 self.list 变为 nil,然后我必须再次加载数据。应该是第一次加载,因为表应该没有信息?它一定是保留了一些东西。
我可以看看你的代码吗?我不认为我使用 Apple 的代码不当,但似乎他们没有考虑到有人重新加载表?【参考方案2】:
问题是 self.imageDownloadsInProgess = [NSMutableDictionary dictionary] 被放置在 ViewDidLoad 方法中,目的是每次都重置字典。但是,如果您将代码放在推送到导航控制器的视图中,则 ViewDidLoad 只会在第一次执行(我不肯定是这种情况)。我将这一行添加到 ViewWillAppear 中,因为每次将视图放置在屏幕上时它都会运行。
【讨论】:
以上是关于Apple 在导航控制器中延迟加载图像,恢复为占位符图像的主要内容,如果未能解决你的问题,请参考以下文章
要求 UISplitViewController 为细节视图控制器延迟加载多个视图控制器