关于Apple的LazyTableImages示例的问题 - 行为与app store不完全相同

时间:2011-02-11 01:16:23

标签: iphone image asynchronous sdk downloading

我有一个带有项目列表的UITableView,每个项目都有自己的图像。我认为Apple的LazyTableImages示例项目非常适合学习,并且在检索到原始列表数据之后用于实现异步下载图像的相同类型的过程。

在大多数情况下,它运作得很好,除了我注意到这个示例应用程序与实际应用程序商店下载图像的方式之间的行为有细微差别。

如果您启动了LazyTableImages示例,然后快速向下滚动,您将看到在滚动完成后 之前,图像不会显示。

现在,如果您使用实际应用商店中的项目列表进行相同的测试,您会看到图像会在新项目进入视图时立即开始显示,即使滚动尚未停止。

我正在努力实现这些相同的结果,但到目前为止,我没有取得任何进展。有没有人对如何做到这一点有任何想法?

谢谢!

2 个答案:

答案 0 :(得分:10)

我很困惑,没有人能回答这个......

所以,我最终想出了如何实现完全在实际应用商店中使用的相同效果,关于图标的下载/显示方式。

参加LazyTableImages示例项目并进行一些简单的修改。

  1. 进入根视图控制器并删除有关表格滚动和/或在cellForRowAtIndexPath中减速的所有检查

  2. 删除对loadImagesForOnScreenRows的所有调用,从而删除该方法。

  3. 进入IconDownload.m并将startDownload方法更改为而不是执行异步图像下载,而是在后台线程上执行同步下载。删除startDownload中的所有代码,并添加以下内容,如下所示:

  4. 
    - (void)startDownload
    {
        NSOperationQueue *queue = [NSOperationQueue new];
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:nil];
    
        [queue addOperation:operation];
    
        [operation release];
        [queue release];
    }
    
    

    然后,添加一个loadImage,如下所示:

    
    - (void)loadImage
    {
        NSData *imageData = [[NSData alloc] initWithContents OfURL:[NSURL URLWithString:appRecord.imageURLString]];
        self.apprecord.appIcon = [UIImage imageWithData:imageData];
        [imageData release];
    
        [self performSelectorOnMainThread:@selector(notifyMainThread) withObject:nil waitUntilDone:NO];
    }
    
    

    然后,像这样添加notifyMainThread:

    
    - (void)notifyMainThread
    {
        [delegate appImageDidLoad:self.indexPathInTableView];
    }
    
    

    完成!运行它,您将看到确切的应用商店行为,不再等待请求图像下载,直到滚动停止,并且不再等待图像显示,直到滚动停止,或者直到用户从屏幕移开他们的手指。

    图像会在单元格准备好显示后立即下载,图像会在下载后立即显示。

    对不起任何错别字,我没有从我的应用中粘贴这个,我输入了,因为我现在离开了我的Mac ...

    无论如何,我希望这能帮到你们所有人......

答案 1 :(得分:0)

结帐UIScrollViewDelegate。我通过监听scrollViewDidScroll:,计算滚动速度(通过检查contentOffset与最后记录的contentOffset除以时间差)来实现这样的事情,并开始一旦速度降至某个阈值以下,就加载图像。 (你可以用UIScrollViewDelegate的scrollViewDidEndDragging:willDecelerate:来实现类似的东西。)

当然,你不必检查速度;只要你看到一个新的单元格,你就可以在UITableViewDelegatetableView:willDisplayCell:forRowAtIndexPath:上加载图像,但我发现如果用户正在翻阅大量的单元格,你就不需要打扰了看到他们会慢下来浏览。