HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Objective-C等待异步操作并将完成处理程序排入队列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我必须计算一个代价高昂的价值.计算此值后,我想运行一个完成处理程序块:

-(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);
        });
    });
}

很标准.

现在,我希望能够重复调用函数,而无需重新排队昂贵的计算.如果昂贵的计算已经在运行,我只想保存完成块,并在costCalculation完成后以相同的结果调用它们.

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

updatE

我可以通过dispatch_group_notify接近.基本上,我可以将工作块排队并将所有完成处理程序排入队列之后:

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,^(){
    complete(result);
});

这样可行,但如果我不需要,我如何判断costCalcuation是否已经运行并且不会将工作排入队列?

解决方法

我认为你已经解决了这个问题.我刚刚想出了一个使用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];
    }
}

不过,可能存在微妙的时间问题.也许我们可以在昂贵的计算函数中使用额外的标志.

大佬总结

以上是大佬教程为你收集整理的ios – Objective-C等待异步操作并将完成处理程序排入队列全部内容,希望文章能够帮你解决ios – Objective-C等待异步操作并将完成处理程序排入队列所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。