在后台线程中加载UIImage

时间:2014-10-25 12:22:16

标签: ios objective-c multithreading uiimage ios8

是否可以在后台线程中加载UIImage而不会导致线程问题? 如果不是最好的方法是什么?我正在使用iOS 8.这就是我现在这样做的方式:

    dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    dispatch_async(backgroundQueue, ^{
        UIImage *image = [UIImage imageNamed: fileName];

        // only update UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            [self setImage: image];
        });

    });

1 个答案:

答案 0 :(得分:14)

你所做的事情在结构上是合理的,但我不知道imageNamed:是否是线程安全的 - 我没有理由相信它是。除非文档另有说明,否则您应该始终认为事情是线程安全的。在这种情况下,它是的<{3}}

  

您不能假设此方法是线程安全的。

在我看来,你应该问自己是否需要这样做。 imageNamed:包含一个缓存机制,可以减轻您担心的任何问题。无论如何,过早优化会浪费你的时间和智力。这里真的有问题吗?用仪器找出;不要使用直觉或直觉。

如果问题是您的图片太大且格式选择不当(例如,您使用的是非常大的JPEG),那么最好集中精力纠正

编辑 iOS 9文档现在说:&#34;在iOS 9及更高版本中,此方法是线程安全的。&#34;这表明我的答案都是正确的,问题现在已经解决了。