在iOS上加载照片时,UI性能不佳

时间:2013-01-01 08:59:33

标签: ios ipad ios6 uiimageview

我正在尝试制作类似于iOS照片应用的照片滑块。我见过PhotoScroller,我正在使用initWithContentsOfFile

CATiledLayer似乎是一个好主意,除了我无法预先生成瓷砖。瓷砖也占用了大量空间。图像是与iCloud同步的文档包的一部分。照片通常是JPEG。从阅读时间开始,看起来像生成瓷砖一样慢于加载整个图像。

似乎大部分时间花在解压缩图像上。将其移动到后台队列并显示较小的图像应该可以正常工作。这就是我想要做的。它起到了一定的作用,但是如果我在没有等待图像加载的情况下滑动那里仍然有一些口吃,这有时会导致滚动视图暂时挂起(当分页时)。

这是设置图像的功能:

- (void)setImage:(UIImage *)image placeholder:(UIImage *)placeholder
{
    _image = image;
    self.zoomScale = 1.0;
    imageView.image = nil;
    imageSize = image.size;
    imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    MachTimer *timer = [MachTimer new];
    [timer start];
    imageView.image = placeholder;
    NSLog(@"placeholder: %f", [timer elapsedSeconds]);
    //imageView.layer.contents = (id)placeholder.CGImage;

    self.contentSize = image.size;
    [self setMaxMinZoomScalesForCurrentBounds];
    self.zoomScale = self.minimumZoomScale;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        MachTimer *timer = [MachTimer new];
        [timer start];
        UIGraphicsBeginImageContext(CGSizeMake(1, 1));
        [image drawAtPoint:CGPointZero];
        UIGraphicsEndImageContext();

        NSLog(@"decode: %f", [timer elapsedSeconds]);

        dispatch_sync(dispatch_get_main_queue(), ^{
            if(_image == image) {
                MachTimer *timer = [MachTimer new];
                [timer start];
                imageView.image = image;
                NSLog(@"display: %f", [timer elapsedSeconds]);
                //imageView.layer.contents = (id)image.CGImage;
            }
        });
    });
}

我的“占位符”时间约为0.00005 - 0.00006秒(解压缩和显示),它们的高度为480像素。我的“解码”时间(对于完整图像)大约是0.8到1.2秒。 “显示”约为0.0001秒(约为0.1毫秒)。

因此,在那些时候,UI应该像黄油一样平滑,但事实并非如此。

我甚至试图将常规contents的{​​{1}}设置为UIView。我尝试过iOS 6.0的CGImage,这似乎让它变得更糟。

我做错了什么?

编辑:

我已将我的示例项目推送到GitHub:

https://github.com/lukescott/PhotoScroller

1 个答案:

答案 0 :(得分:0)

我会为辛勤工作(照片加载或解码)创建一个后台线程,当它完成时,然后使用工具(队列,消息等)将UI工作(绘制或其他)委托给主线程。