2

我有一个从 Internet 下载的照片的图库视图,所以我使用了 Enormego 的 EGOImageView。我注意到,当我在图像进入缓存后向下滚动我的 tableview 时,滚动会滞后。我立即发现,当从硬盘驱动器检索图像时,return [UIImage imageWithContentsOfFile:cachePathForKey(key)];它正在主线程上工作,所以我将操作添加到 NSOperationQueue。这将延迟减少了一半,但滚动仍然结结巴巴。浏览完代码后,我注意到在success方法中

- (void)imageLoaderDidLoad:(NSNotification*)notification {
    if(![[[notification userInfo] objectForKey:@"imageURL"] isEqual:self.imageURL]) return;

    UIImage* anImage = [[notification userInfo] objectForKey:@"image"];
    self.image = anImage;
    [self setNeedsDisplay];

    if([self.delegate respondsToSelector:@selector(imageViewLoadedImage:)]) {
        [self.delegate imageViewLoadedImage:self];
    }
}

评论self.image = anImage;完全摆脱了滞后(但显然我没有得到图像)。据我所知,如果我想改变 UI,必须在主线程中完成。有没有办法为 EGOImageView 设置图像而不会滞后滚动?

注意:JPG 大约 50kB

谢谢

4

2 回答 2

0
  1. 子类 uitableViewCell 并在 drawContentView 中做你自己的溺水。
  2. 在后台线程中调整图像大小,然后在单元格中显示它们。

PS:如果在 git hub 上找到的代码对您来说不够好,请尝试编写适合您问题的自己的代码。

于 2012-02-06T07:34:50.830 回答
0

据我了解,在主线程上启动异步磁盘查询所需的所有步骤都需要几毫秒,这足以让滚动看起来像结巴一样,所以我决定完全删除大图像的硬盘缓存和而是创建一个 NSMutableDictionary ,它将 UIImage 作为对象,并将 NSURL.absoluteString 作为键。这可以无缝地工作,但显然有一个内存猪的缺点。我检查了一些照片共享应用程序的内存使用情况,我已经能够让应用程序的内存使用量超过 100MB,所以似乎其他人都在这样做。

于 2012-04-20T03:37:47.663 回答