iphone - 如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障 block 复制 FIFO 队列?

标签 iphone ios concurrency grand-central-dispatch

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

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

当我使用 DISPATCH_QUEUE_SERIAL 时,订单得到维护。

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

文档说明:

A dispatch queue that executes blocks concurrently. Although they execute blocks concurrently, you can use barrier blocks to create synchronization points within the queue.

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

最佳答案

我能想到的最简单的 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 的突变,与顺序无关。

关于iphone - 如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障 block 复制 FIFO 队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098909/

相关文章:

objective-c - 在单独的线程上调用我的方法有哪些不同的方式?

Java多线程与方法调用结合使用?

iphone - 安装时将数据传递到我的应用程序

iphone - UIScrollview 不会一直滚动

iphone - 覆盖自定义 UITableViewCell

iphone - 查找 URL 的下载大小(内容长度)

ios - 如何改变 "scrollView.setContentOffset"的速度

objective-c - Obj-c/ cocoa touch : Have UITableViewCell - CellTextField only accept Numeric chars?

android - 如何让 Android/IOS 应用协同工作

java - java中可以同时使用fork/join和executor服务吗?