是否可以在后台线程中加载 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];
});
});
最佳答案
你所做的在结构上是合理的,但我不知道 imageNamed:
是否是线程安全的——而且我没有理由相信它是。您应该始终假设事物不是线程安全的,除非文档另有说明。在这种情况下,documentation specifically says它不是:
You can not assume that this method is thread safe.
在我看来,您应该问问自己是否需要这样做。 imageNamed:
包含一个缓存机制,可以让您摆脱任何担心。无论如何,过早的优化都是在浪费您的时间和脑力。这里真的有问题吗?使用 Instruments 找出答案;不要使用直觉或本能。
如果问题是您的图片太大并且格式选择不当——例如,您使用的是非常大的 JPEG——最好集中精力纠正那个。 p>
编辑 iOS 9 文档现在说:“在 iOS 9 及更高版本中,此方法是线程安全的。”这表明我的回答是正确的,而且问题现在已经解决了。
关于ios - 在后台线程中加载 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562317/