如何在加载大型UIImage时改善用户体验?

时间:2012-10-18 09:56:11

标签: ios ipad cocoa-touch uiview uiviewcontroller

我正在使用大图片(2000x2000,500kb)作为iPad应用中大多数View Controllers的背景图片。

问题是应用程序似乎在第一次使用这样的图像加载子ViewController时冻结了父ViewController(之后由于我假设的缓存速度更快)。

我会将它加载到一个单独的线程中,并在加载时显示一些指示符,但是我知道所有与UI相关的操作都应该在主线程上完成。

我是否有办法改善用户体验,因此应用程序似乎没有冻结约。 2秒? (在我的情况下,平铺图像不是一个选项)

1 个答案:

答案 0 :(得分:5)

所有UIKit操作都应该在主线程上完成是错误的!只应在主线程上执行绘图操作。完全保存在单独的线程中加载UIImage并在此之后将其交给主线程。但是我不认为加载需要那么长时间。我认为这可能是花费时间的绘图。

但是:当UIActivityIndicatorView在其自己的线程中运行时(与所有CoreAnimation动画一样),即使在添加指标后阻塞主线程,它也会保持动画效果。试试这个:

UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityIndicator startAnimating];
[self addSubview:activityIndicator];

dispatch_async(dispatch_get_main_queue(), ^{
    UIImage* image = [UIImage imageNamed:@"MyImage"];
    UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
    [self addSubview:imageView];

    [activityIndicator removeFromSuperview];
});

这将启动UIActivityIndicator并开始在下一个运行循环周期中加载图像。添加图像后,将删除超级视图。也许您必须再次调度活动指示器的移除,以便UIKit有时间绘制图像。在这种情况下,但[activityIndicator removeFromSuperview]在另一个dispatch_async到第一个块内的主队列。