在后台线程中加载UIImage

是否有可能在后台线程中加载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:是线程安全的 – 我没有理由相信它是。 除非文档中另有说明,否则应始终假设事物不是线程安全的。 在这种情况下, 文档明确指出它不是

你不能认为这个方法是线程安全的。

在我看来,你应该问自己,你是否需要这样做。 imageNamed:包含一个caching机制,可以让你无论你担心什么。 无论如何,不​​成熟的优化是浪费你的时间和精力。 这里真的有问题吗? 用仪器查明; 不要用直觉或本能。

如果问题在于你的图像太大,格式不正确(例如,你使用的是非常大的JPEG),最好集中精力纠正。

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