如何从磁盘读取图像并阻塞直到读取?

时间:2010-04-14 15:19:10

标签: iphone objective-c xcode file

我正在从磁盘加载5张图片,但我希望我读到的第一张图片尽快显示。现在我做

UIImage *img = [UIImage imageWithContentsOfFile:path];

在for循环中,但是因为imageWithContentsOfFile:path没有阻塞所有5个图像,所以在第一个图像出现之前最终会从磁盘读取(因为它们都在耗尽I / O)。我通过加载一个来确认这一点,它在屏幕上显示的速度比我加载所有5个更快。

我想加载第一张图像和直到它完全读取并显示,然后加载下一张4或加载第一张图像并在加载下一张4之前收到通知,但是我无法想办法做到这一点。没有用于数据或图像块的'WithContentsOfFile'方法,它们不通知或具有委托方法。有什么建议吗?

由于

3 个答案:

答案 0 :(得分:4)

首先将图像文件加载到NSData对象中,然后使用数据初始化图像,确保图像从磁盘完全加载:

NSError *err = nil;
NSData *data [NSData dataWithContentsOfFile:path 
                                    options:NSDataReadingUncached
                                      error:&err];
UIImage *img = [UIImage imageWithData:data];

克劳斯

答案 1 :(得分:0)

AFAICS无法保证图像数据在内存中。 initWithContentsOfFile上的文档说明了

  

此方法将图像数据加载到   记忆并将其标记为可清除。如果   数据被清除并且需要   重新加载,图像对象加载   来自指定路径的数据

因此操作系统可能随时释放内存并使您的应用程序再次从文件加载图像。但是,我认为你可以尝试做一些技巧,比如调用需要实际数据的方法。您可以通过调用返回图像的size开始。我不确定size是否真的需要所有图像数据而且没有缓存。您可能必须在基础CGImageRef上调用其他方法。像CGImageGetBytesPerRow这样的东西可能会起作用。但我首先要从size

开始

答案 2 :(得分:-1)

您希望在后台加载图像,然后在完成加载后回调,这样您就可以显示它...这样,读取图像的块就不会影响您,您可以在其他人加载时显示图像,或做任何你喜欢的事情..

之类的东西
-(void) getMyImage:(NSString*)path
then 
[self performSelectorInBackground:@selector(getMyImage) withObject:path];

you can also have a methods
-(void)didFinishLoadingImage:(UIImage*)image// which gets called in getMyImage when  the image is done loading...something like
[self performMethodInMainThread:@selector(didFinishloadingImage:)] etc...

你可以使用它来加载你想要的图像..你可以在那里传递额外的变量,这样你就可以知道你正在加载哪个图像,或者想出一些东西来跟踪,但使用这样的东西应该能够解决你的问题...

希望有所帮助