web-dev-qa-db-ja.com

2つのメソッド(iOS)の完了後に実行するメソッドを記述する方法

ボタンクリックイベントで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以外の方法でこれを実現するにはどうすればよいですか

ブロックについて読んでください。ブロックは初めてです。このためにブロックを書くのを手伝ってくれる人はいますか?そして、どんな説明もとても役に立ちます。ありがとう

23
Lithu T.V

これが ディスパッチグループ の目的です。

_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()も参照してください。

52
Rob Napier

私がGoogleのiOSフレームワークから得たきちんとした方法は、彼らがかなり大きく依存しています:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {


    if (signInDoneSel) {
        [self performSelector:signInDoneSel];
    }

}
0
ChuckKelly