-(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等待异步 *** 作并将完成处理程序排入队列所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)