如何使用DISPATCH_QUEUE_CONCURRENT和障碍块复制FIFO队列?

时间:2013-09-30 16:11:19

标签: iphone ios concurrency grand-central-dispatch

我读到DISPATCH_QUEUE_SERIAL是一个FIFO队列,只能运行在一个处理器核心上。

我的应用程序从磁盘中提取图像,应用效果,创建UIImage并将图像添加到数组中。数组中的顺序必须与从磁盘读取图像的顺序相同。

当我使用DISPATCH_QUEUE_SERIAL时,维持订单。

但是使用DISPATCH_QUEUE_CONCURRENT的设计模式是什么,所以图像在所有内核上都得到处理,但是一旦完成处理,它们就会按FIFO顺序添加到数组中?

文档sais:

  

同时执行块的调度队列。虽然他们   同时执行块,您可以使用障碍块来创建   队列中的同步点。

是否存在用于创建具有并发处理的FIFO队列的障碍块的示例?

1 个答案:

答案 0 :(得分:2)

我能想到的最简单的GCD方法就是这样:

NSArray* arrayOfImages = <your array of images to be processed>;
NSMutableArray* processedImages = [arrayOfImages mutableCopy];
dispatch_queue_t protectMutableArray = dispatch_queue_create("", 0);
dispatch_apply(arrayOfImages.count, dispatch_get_global_queue(0, 0), ^(size_t index) {
    UIImage* unprocessedImage = arrayOfImages[index];
    UIImage* processedImage = ProcessImage(unprocessedImage);
    dispatch_sync(protectMutableArray, ^{
        [processedImages replaceObjectAtIndex: index withObject: processedImage];
    });
});

dispatch_apply返回时,processedImages将包含保留其订单的所有已处理图像,但处理将并行完成。另请注意,串行队列的dispatch_sync只是序列化processedImages的突变,与排序无关。