【发布时间】:2016-05-03 17:21:47
【问题描述】:
我进行了很多搜索以了解其他人如何解决此问题,但不幸的是,我没有找到此特定问题的答案。非常感谢您的帮助。
以下是摘要: 我的班级有两个方法,method1 和 method2。我必须在 method1 中调用一个异步函数。然后代码继续执行并到达method2。但是在方法 2 中,有些情况我需要在方法 1 中使用异步调用的结果,因此我需要确保方法 1 中的异步调用已经完成,然后再继续方法 2 的其余部分。
我知道一种方法是使用信号量,另一种方法是使用完成块。但我想以最通用的方式执行此操作,因为会有其他方法,类似于方法 2,它们将再次需要等待方法 1 中的异步调用完成才能继续执行。同样出于同样的原因,我不能简单地调用 method2 本身内部的 async 函数并将其余的 method2 放在其完成块中。
这是我想要做的一个粗略的想法。如果有人将完成块添加到这个伪代码中,我将不胜感激,这样我就可以清楚地看到事情是如何工作的。顺便说一句,method1 和 method2(以及此类中的所有其他方法)在同一个线程上(但不是主线程)。
@implementation someClass
-(void)method1 {
for (each item in the ivar array) {
if (condition C is met on that item) {
some_independent_async_call(item, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(int result, int *someArray) {
if (result > 0) {
// The async call worked correctly, we will need someArray
}
else {
// We didn't get someArray that we wanted.
}
});
}
}
}
-(void)method2 {
// Select one item in the ivar array based on some criteria.
if (condition C is met on that item) {
// Wait for some_independent_async_call() in method1 to complete.
// Then use someArray in the rest of the code.
}
else {
// Simply continue the rest of the code.
}
}
@end
更新:我知道我可以在异步调用完成后发出信号量,并且我可以在方法 2 中等待相同的信号量,但我想使用完成块,因为我认为这会更通用,特别是如果有其他方法与此类中的方法 2 类似。有人可以在我的代码中添加完成块吗?
【问题讨论】:
-
您的
for循环逻辑让我认为这可能是您正在寻找的内容:“使用调度组——分组块允许聚合同步。您的应用程序可以提交多个块和跟踪它们何时全部完成,即使它们可能在不同的队列上运行。当在所有指定任务都完成之前无法取得进展时,此行为会很有帮助。" -
谢谢,但我只有一个需要完成的块,以及需要使用其结果的多个地方。您能否在上面的伪代码中添加调度组在这种情况下的工作方式?
-
您的异步调用在循环中。您的意思是“条件 C”仅适用于一项吗?
-
不,实际上它可能适用于多个项目,我们需要在每个项目上调用该异步方法。稍后,在方法 2 中,我们只选择一个项目,如果它具有条件 C,我们需要从方法 1 中的异步调用中为该特定项目使用 someArray。
-
好的...这就是我建议组的原因。如果您有多个异步操作正在运行,我假设您希望它们在进入 method2 之前全部完成。
标签: objective-c asynccallback completion-block