gpt4 book ai didi

objective-c - 有什么方法可以确保 GCD 任务在没有串行队列的情况下按顺序完成?

转载 作者:行者123 更新时间:2023-12-01 15:32:33 26 4
gpt4 key购买 nike

我正在使用 GCD 做一些繁重的工作——图像处理等等——通常同时运行 3 或 4 个任务。

其中一些任务比其他任务完成得更快。如何确保以正确的原始顺序触发回调 - 不使用串行队列

例如:

  • 任务一需要 1 秒
  • 任务二用时 5 秒
  • 任务三需要 2 秒

尽管计算时间不同,我如何确保最终回调顺序为一、二、三?

// self.queue = dispatch_queue_create("com.example.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(self.queue, ^{
// Long-running code here of varying complexity

dispatch_async(dispatch_get_main_queue(), ^{
// Callback here
});
});

编辑:

根据评论,第一个通知应该在任务一完成后立即发出,即使其余任务正在处理中也是如此。当任务三完成时,它应该保持直到任务二完成,然后首先关闭快速连续通知二和三。

我在想某种用于推送和转移任务的可变数组可能会起作用。有没有更简洁的方法?

最佳答案

您的每个完成 block (除了第一个)都有两个依赖项:繁重的工作和前一个繁重工作的完成 block 。

使用 NSOperationQueueNSBlockOperation 而不是直接使用 GCD 来满足您的要求会简单得多。 (NSOperationQueue 构建在 GCD 之上。)

您需要一个操作队列和对先前完成操作的引用:

@property (nonatomic, strong) NSOperationQueue *queue;
@property (nonatomic, strong) NSOperation *priorCompletionOperation;

queue 初始化为 NSOperationQueue。在获得第一份工作之前,将 priorCompletionOperation 留空。

然后只需在将操作提交到队列之前设置依赖项即可:

    NSBlockOperation *heavyLifting = [NSBlockOperation blockOperationWithBlock:^{
// long-running code here of varying complexity
}];

NSBlockOperation *completion = [NSBlockOperation blockOperationWithBlock:^{
// Callback here
}];

[completion addDependency:heavyLifting];
if (self.priorCompletionOperation) {
[completion addDependency:self.priorCompletionOperation];
}

[self.queue addOperation:heavyLifting];
[[NSOperationQueue mainQueue] addOperation:completion];

self.priorCompletionOperation = completion;

请注意,您应该确保此作业排队代码一次仅从单个线程运行。如果您只从主线程(或主队列)中排队作业,那将自动发生。

关于objective-c - 有什么方法可以确保 GCD 任务在没有串行队列的情况下按顺序完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17671520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com