我进行了很多搜索以了解其他人是如何解决这个问题的,但不幸的是,我没有找到这个特定问题的答案。我将衷心感谢您的帮助。
总结一下:我的类中有两个方法,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。有人可以将完成块添加到此代码中,因为我在使其工作时遇到问题吗?