使用缓存异步加载本地 UIImage



UIScrollViewController

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

我有一个UIScrollViewController,它有几个子视图。每个子视图都包含一个UIImageview,当滚动UIImageView时,当前页面两侧的页面将使用

imageView = [[UIImageView alloc] initWithContentsOfFile:fileName];

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

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

您可以在另一个线程中异步加载图像,或者如果您仅支持高于 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,然后当用户交互停止(通过委托方法检测到)时,您可以重新加载可见的图像视图。

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

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

最新更新