大佬教程收集整理的这篇文章主要介绍了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中并自己调用它们?如果我这样做,我需要在这个数组周围进行什么样的同步?
我可以通过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是否已经运行并且不会将工作排入队列?
// 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,请注明来意。