他の人がこの問題をどのように解決したかを調べるためにたくさん検索しましたが、残念ながら、この特定の質問に対する答えは見つかりませんでした. よろしくお願いします。
要約は次のとおりです。私のクラスには、method1 と method2 という 2 つのメソッドがあります。method1 内で非同期関数を呼び出す必要があります。その後、コードは実行を続け、method2 に到達します。しかし、メソッド 2 では、その非同期呼び出しの結果をメソッド 1 で使用する必要がある場合があるため、メソッド 2 の残りの部分に進む前に、メソッド 1 の非同期呼び出しが終了していることを確認する必要があります。
1 つはセマフォを使用する方法で、もう 1 つは完了ブロックを使用する方法です。しかし、私はこれを最も一般的な方法で行いたいと考えています。これは、実行を続行する前に、method1 の非同期呼び出しが完了するまで待機する必要がある method2 と同様の他のメソッドがあるためです。また、同じ理由で、単純に method2 自体の内部で async 関数を呼び出して、残りの method2 をその完了ブロックに入れることはできません。
これが私がやろうとしていることの大まかな考えです。誰かがこの疑似コードに CompletionBlocks を追加してくれるとありがたいです。そうすれば、物事がどのように機能するかを明確に理解できます。ところで、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
更新: 非同期呼び出しが完了したらセマフォにシグナルを送ることができ、method2 で同じセマフォを待つことができることはわかっていますが、代わりに完了ブロックを使用したいと考えています。このクラスの method2。このコードを機能させるのに問題があるので、誰かがこのコードに完了ブロックを追加してもらえますか?