ios - 在后台线程中加载 UIImage

标签 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];
        });

    });

最佳答案

你所做的在结构上是合理的,但我不知道 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/

相关文章:

php - 我可以从 PHP 调用多核 LAMP 机器上的多个 FFMPEG 进程吗?

ios - NSDate 在 CoreData 中被保存为时间戳

ios - 需要在 AppDelegate 导航栏左侧设置 logo

objective-c - iPhone UISearchBar 示例

objective-c - 在 tabBarView 中管理套接字流

multithreading - 使用 MVar 在 Haskell 中创建线程安全队列(也许?)

ios - 如果日历访问被拒绝,则显示警报 Swift 3

iphone - 在 iPhone 程序中加载初始 Nib 的问题

ios - UIPickerView 中的行选择

JavaFX Node.snapshot() 从工作线程调用时卡住线程,想法?