我读到DISPATCH_QUEUE_SERIAL
是一个FIFO队列,只能运行在一个处理器核心上。
我的应用程序从磁盘中提取图像,应用效果,创建UIImage并将图像添加到数组中。数组中的顺序必须与从磁盘读取图像的顺序相同。
当我使用DISPATCH_QUEUE_SERIAL
时,维持订单。
但是使用DISPATCH_QUEUE_CONCURRENT
的设计模式是什么,所以图像在所有内核上都得到处理,但是一旦完成处理,它们就会按FIFO顺序添加到数组中?
文档sais:
同时执行块的调度队列。虽然他们 同时执行块,您可以使用障碍块来创建 队列中的同步点。
是否存在用于创建具有并发处理的FIFO队列的障碍块的示例?
答案 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
的突变,与排序无关。