gpt4 book ai didi

ios - Objective-C 等待异步操作和排队完成处理程序

转载 作者:可可西里 更新时间:2023-11-01 06:06:20 26 4
gpt4 key购买 nike

我必须计算一个昂贵的值。计算完这个值后,我想运行一个完成处理程序 block :

-(void) performCostlyCalculationWithCompletionHandler:(void (^)(void)complete 
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
id result = [self costlyCalculation];
dispatch_async(dispatch_get_main_queue(), ^{
complete(result);
});
});
}

相当标准。

现在,我希望能够重复调用此函数,而无需重新排队 coSTLyCalculation。如果 coSTLyCalculation 已经在运行,我只想保存完成 block ,并在 coSTLyCalculation 完成后使用相同的 result 调用它们。

有没有一种简单的方法可以使用 GCD 或 NSOperationQueue 来做到这一点?或者我应该只将完成 block 存储在 NSArray 中并自己调用它们?如果我这样做,我需要在这个数组周围放置什么样的同步?

更新

我可以接近 dispatch_group_notify。基本上,我可以将工作 block 排入队列并将所有完成处理程序排入队列以在组之后运行:

dispatch_group_t group = dispatch_group_create();

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, queue, ^(){
// Do something that takes a while
id result = [self costlyCalculation];
dispatch_group_async(group, dispatch_get_main_queue(), ^(){
self.result = result;
});
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^(){
complete(result);
});

这行得通,但我如何判断 coSTLyCalcuation 是否已经在运行,如果不需要,我如何不将工作排入队列?

最佳答案

我认为您已经基本解决了问题。我刚刚想出了一个使用 NSOperationQueue 和 NSOperations 之间的依赖关系的替代方案。这是我认为的伪代码。

// somewhere, create operation queue
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];

-(void)tryCalculation:(CompletionBlockType)completionBlock
{
if(opQueue.operationCount > 0)
{
NSOperation *op = [[NSOperation alloc] init];
op.completionBlock = completionBlock;
// you can control how to synchronize completion blocks by changing dependency object. In this example, all operation will be triggered at once when costly calculation finishes
[op addDependency:[opQueue.operations firstObject]];
[opQueue addOperation:op];
}
else
{
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(costlyCalculation) object:nil];
op.completionBlock = completionBlock;
[opQueue addOperation:op];
}
}

不过,仍然可能存在微妙的时间问题。也许我们可以在 coSTLyCalculation 函数中使用额外的标志。

关于ios - Objective-C 等待异步操作和排队完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867425/

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