使用缓存异步加载本地UIImage

时间:2012-06-04 09:53:45

标签: ios xcode caching asynchronous uiimage

UIScrollViewController

| ----- UIImageView1,2,3,4,5 ...

我有UIScrollViewController,其中包含多个子视图。每个子视图都包含一个UIImageview,当滚动UIImageView时,将使用

加载当前页面任一侧的页面
imageView = [[UIImageView alloc] initWithContentsOfFile:fileName];

但是当本地图像文件变得非常大(> 2MB)时,滚动变得非常有影响并且卡住了。

有没有办法避免这种情况?例如,使用缓存还是异步执行?

1 个答案:

答案 0 :(得分:5)

您可以在另一个线程中异步加载图像,或者如果您只支持高于4的iOS,则使用块执行它非常容易。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
    UIImageView* imageView = [[[UIImageView alloc] initWithContentsOfFile:fileName]autorelease];       
    dispatch_async(dispatch_get_main_queue(), ^{
        //Maybe correct the frame too
        [self.view addSubview:imageView];
    });
});

如果你不能使用块,你可以在不同的线程中执行,但它涉及的更多。

无论如何,我建议:

  • 最好创建添加到滚动视图的UIImageViews,使用'dummy'或'spinner',然后当用户交互停止时(通过委托方法检测到),您可以重新加载可见的图像视图。

  • 当用户滚动时,最好为所需的图像加载和缓存UIImage对象(例如,将它们存储在数组或字典中)。

  • 缩放UIImage内容以适合ScrollView中的UIImageView框架。这样在渲染时,UIImage就不会“自动缩放”提供的图像,因此速度会更快。