ios – Objective-C等待异步 *** 作并将完成处理程序排入队列

ios – Objective-C等待异步 *** 作并将完成处理程序排入队列,第1张

概述我必须计算一个代价高昂的价值.计算此值后,我想运行一个完成处理程序块: -(void) performCostlyCalculationWithCompletionHandler:(void (^)(void)complete { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ 我必须计算一个代价高昂的价值.计算此值后,我想运行一个完成处理程序块:

-(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 queueNSOperationQueue *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等待异步 *** 作并将完成处理程序排入队列所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1025982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存