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 在导航控制器中延迟加载图像,恢复为占位符图像的主要内容,如果未能解决你的问题,请参考以下文章

javascript 防止从延迟加载的图像中恢复内容

要求 UISplitViewController 为细节视图控制器延迟加载多个视图控制器

*不*使用导航控制器在视图中保存和恢复图像?

具有延迟加载图像的结构化数据?

导航控制器到 Pushviewcontroller 到新的视图控制器,WebKit 延迟/首次加载时慢

ViewController 委托和 viewWillDisappear 计时问题