8

我正在尝试使用以下内容从本地 URL 加载图像:

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
[self.imageView setImage:image];
NSLog(@"imageView set");

所以我几乎立即在控制台中看到“imageView set”,但它需要很长时间才能反映在 UI 中(有时需要几分钟!)。

知道为什么会这样吗?

4

4 回答 4

9

当我在后台线程(我正在下载图像文件)中设置图像时,这发生在我身上。只要确保您的代码在主线程中运行。图像会立即改变。

// In a background thread...

UIImage *image = ... // Build or download the image

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.imageView setImage:image]; // Run in main thread (UI thread)
});
于 2015-02-25T10:02:04.300 回答
4

您应该加载仪器并查看它到底在做什么。

对于初学者,你应该尽你所能避免绘图线程上的 I/O。另外,是否同时有其他 I/O 请求?

AUIImage不一定需要是单个位图表示 - 它可以由缓存支持和/或延迟加载。因此,仅仅因为“图像”被“设置”,并不意味着最佳位图已加载到内存中并准备好进行渲染——它可能会被推迟到请求渲染(绘制)之前。

分析 OTOH 将(通常)告诉您为什么它花费的时间比预期的要长。

于 2013-05-20T04:50:20.110 回答
-1

从 NSData 加载图像需要更多时间。相反,您可以简单地使用以下代码:

UIImage *image = [UIImage imageWithContentsOfFile:fileURL];

试试看。

于 2013-05-20T04:49:50.733 回答
-2

所以我尝试了以下方法:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
    [self.imageView setImage:image];
    NSLog(@"imageView set");
});

而且速度要快得多。不知道为什么。

于 2013-05-20T04:50:47.820 回答