gpt4 book ai didi

iphone - 在 iPhone 应用程序中从磁盘加载图像很慢

转载 作者:可可西里 更新时间:2023-11-01 03:01:24 27 4
gpt4 key购买 nike

在我的 iPhone 应用程序中,我使用 iPhone 的相机拍摄照片并将其保存在磁盘(应用程序的文档文件夹)中。这是我保存它的方式:

[UIImageJPEGRepresentation(photoTaken, 0.0) writeToFile:jpegPath atomically:YES];

使用最大压缩率,我认为从磁盘读取图像会很快。但它不是!我将图像用作其中一个 View 中按钮的背景图像。我这样加载它:

[self.frontButton setBackgroundImage:[UIImage imageWithContentsOfFile:frontPath] forState:UIControlStateNormal];

当我使用此按钮导航到 View 时,速度很慢而且断断续续。我该如何解决这个问题?

最佳答案

+imageWithContentsOfFile: 是同步的,因此您的主线程上的 UI 会被从磁盘操作加载的图像阻塞并导致断断续续。解决方案是使用一种从磁盘异步加载文件的方法。您也可以在后台线程中执行此操作。这可以很容易地完成,方法是将 +imageWithContentsOfFile: 包装在 dispatch_async() 中,然后在主队列上嵌套 dispatch_async() 包装 -setBackgroundImage: 因为 UIKit 方法需要在主线程上运行。如果您希望图像在 View 加载后立即显示,您需要从磁盘预先缓存图像,以便在 View 显示时立即将其保存在内存中。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

UIImage *image = [UIImage imageWithContentsOfFile:frontPath];

dispatch_async(dispatch_get_main_queue(), ^{
[self.frontButton setBackgroundImage:image forState:UIControlStateNormal];
});

});

顺便说一句,如果按钮图像发生渐变,请考虑使用以下属性来确保从磁盘加载的图像文件很小:

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

或(已弃用,仅在需要支持 iOS 4.x 时使用):

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight

关于iphone - 在 iPhone 应用程序中从磁盘加载图像很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016235/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com