ボタンクリックイベントでmethod1:
とmethod2:
の2つのメソッドを実行する必要があります。どちらにもネットワークコールがあるため、どちらが先に終了するかがわかりません。
Method1とmethod2の両方が完了したら、別のメソッドmethodFinish
を実行する必要があります。
-(void)doSomething
{
[method1:a];
[method2:b];
//after both finish have to execute
[methodFinish]
}
通常のstart method1:-> completed -> start method2: ->completed-> start methodFinish
以外の方法でこれを実現するにはどうすればよいですか
ブロックについて読んでください。ブロックは初めてです。このためにブロックを書くのを手伝ってくれる人はいますか?そして、どんな説明もとても役に立ちます。ありがとう
これが ディスパッチグループ の目的です。
_dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// Add a task to the group
dispatch_group_async(group, queue, ^{
[self method1:a];
});
// Add another task to the group
dispatch_group_async(group, queue, ^{
[self method2:a];
});
// Add a handler function for when the entire group completes
// It's possible that this will happen immediately if the other methods have already finished
dispatch_group_notify(group, queue, ^{
[methodFinish]
});
_
ディスパッチグループはARCで管理されます。それらは、すべてのブロックが実行されるまでシステムによって保持されるため、ARCでのメモリ管理は簡単です。
グループが完了するまで実行をブロックする場合は、dispatch_group_wait()
も参照してください。
私がGoogleのiOSフレームワークから得たきちんとした方法は、彼らがかなり大きく依存しています:
- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {
if (signInDoneSel) {
[self performSelector:signInDoneSel];
}
}