如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?
Posted
技术标签:
【中文标题】如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?【英文标题】:How to replicate a FIFO queue with DISPATCH_QUEUE_CONCURRENT and barrier blocks? 【发布时间】:2013-09-30 16:11:18 【问题描述】:我读到DISPATCH_QUEUE_SERIAL
是一个 FIFO 队列,只能在一个处理器内核上运行。
我的应用程序从磁盘获取图像、应用效果、创建 UIImage 并将图像添加到数组中。数组中的顺序必须与我从磁盘读取图像的顺序相同。
当我使用DISPATCH_QUEUE_SERIAL
时,订单保持不变。
但是使用 DISPATCH_QUEUE_CONCURRENT
的设计模式是什么,所以图像在所有内核上都得到处理,但一旦处理完成,它们就会按 FIFO 顺序添加到数组中?
文档说明:
并发执行块的调度队列。虽然他们 并发执行块,你可以使用屏障块来创建 队列中的同步点。
是否有障碍块创建具有并发处理的 FIFO 队列的示例?
【问题讨论】:
跟踪它们应该进入数组的索引难道不够吗?然后无论它们完成加载的顺序如何,它们都会进入该索引。 是的,我也想过这个。但我希望有一个 GCD 设计模式来解决这个问题。 【参考方案1】:我能想到的最简单的 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
的突变,与排序无关。
【讨论】:
以上是关于如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?