0

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

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

当我使用时DISPATCH_QUEUE_SERIAL,订单保持不变。

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

文档说:

并发执行块的调度队列。尽管它们同时执行块,但您可以使用屏障块在队列中创建同步点。

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

4

1 回答 1

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与排序无关。

于 2013-09-30T16:55:48.053 回答