gpt4 book ai didi

objective-c - NSOperationQueue 中的屏障操作

转载 作者:太空狗 更新时间:2023-10-30 03:41:16 24 4
gpt4 key购买 nike

我们如何使用 NSOperationQueue 或任何基于 NSOperationQueue 的用户定义数据结构来实现 dispatch_barrier_async 的等效行为?

要求是,无论何时提交障碍操作,它都应该等到之前提交的所有非障碍操作完成执行,并阻止之后提交的其他操作。

  • 无障碍操作应该能够同时执行。
  • 屏障操作应该串行执行。

注意:不使用 GCD,因为它不提供(或至少很难)对操作的很多访问,例如取消单个操作等。

最佳答案

这或多或少是jeffamaphone是说,但我放了一个gist粗略地说,这应该按照您的要求进行。

我创建了一个由 NSOperationQueue 组成的 NSMutableArray,用作“队列中的队列”。每次添加 BarrierOperation 对象时,您都会在末尾添加一个新的 suspended 操作队列。这将成为 addingQueue,您可以向其中添加后续操作。

- (void)addOperation:(NSOperation *)op {
@synchronized (self) {
if ([op isKindOfClass:[BarrierOperation class]]) {
[self addBarrierOperation:(id)op];
} else {
[[self addingQueue] addOperation:op];
}
}
}

// call only from @synchronized block in -addOperation:
- (void)addBarrierOperation:(BarrierOperation *)barrierOp {
[[self addingQueue] setSuspended:YES];

for (NSOperation *op in [[self addingQueue] operations]) {
[barrierOp addDependency:op];
}

[[self addingQueue] addOperation:barrierOp];

// if you are free to set barrierOp.completionBlock, you could skip popCallback and do that

__block typeof(self) weakSelf = self;
NSOperation *popCallback = [NSBlockOperation blockOperationWithBlock:^{
[weakSelf popQueue];
}];
[popCallback addDependency:barrierOp];
[[self addingQueue] addOperation:popCallback];
[[self addingQueue] setSuspended:NO];

NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue setSuspended:YES];

[_queueOfQueues addObject:opQueue]; // fresh empty queue to add to
}

当一个 NSOperationQueue 完成时,它被弹出,下一个开始运行。

- (void)popQueue
{
@synchronized (self) {
NSAssert([_queueOfQueues count], @"should always be one to pop");
[_queueOfQueues removeObjectAtIndex:0];

if ([_queueOfQueues count]) {
// first queue is always running, all others suspended
[(NSOperationQueue *)_queueOfQueues[0] setSuspended:NO];
}
}
}

我可能漏掉了一些重要的东西。细节决定成败。

这对我来说有点像家庭作业。如果是这样,请告诉我我得到了什么等级。 :)


附录:通过abhilash1912的评论,不同但相似approach .该代码已测试,因此它已经成功。但它有点陈旧(从今天开始大约 2 年;一些已弃用的方法用法)。此外,我怀疑从 NSOperationQueue 继承是否是最好的路径,尽管它具有保持熟悉的优点。无论如何,如果您已经读到这里,可能值得一读。

如果您创建或找到了世界上最棒的 BarrierQueue 类,请在评论中或以其他方式告知我们,以便将其链接起来。

关于objective-c - NSOperationQueue 中的屏障操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22509735/

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