dispatch_async会慢一点,然后是performSelectorInBackground :?

时间:2012-09-24 08:08:00

标签: objective-c ios multithreading cocoa-touch grand-central-dispatch

在我的应用程序中,我使用performSelectorInBackground:从磁盘加载图像。在使用dispatch_async进行一些单元测试之后,我决定用dispatch_async调用替换我的performSelectorInBackground。

dispatch_queue_t currentBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(currentBackgroundQueue, ^{
    [self getImageFromDisk:sPath delegate:(id)delegate];
});

代码似乎有效,但现在我的图像加载速度比之前慢。当用户滚动图像时,这会导致黑色图像。

我的应用程序包含某种photoscroller。我不能使用apple的平铺示例代码,因为它会将应用程序大小增加到很多。我使用this代码段从磁盘加载图片。

1 个答案:

答案 0 :(得分:5)

我之前在其他类似问题上说过这一点,在全局队列上使用dispatch async会导致同步行为,特别是对于最终更新UI的代码。 YMMV,但是当我尝试它时,它或多或少与同步调用相同。使用NSOperations创建和使用您自己的队列,或(创建并使用您自己的队列)。

我认为这样做的原因是发布到全局队列的任何事件都将消耗队列处理时间,即使代码技术上 asynch。不要将全局队列用于后台操作。

使用自定义队列并抽取自己的runloop。