0

API(NSURLSessionDataTask async)を呼び出す別のスレッドで3つのメソッドを次々に実行する必要があります。ディスパッチ グループを調査しましたが、これはメソッド 1 と 2 を同時に実行し、終了時にメソッド 3 を実行するようです。

dispatch_group_t group = dispatch_group_create();

//METHOD 1
dispatch_group_enter(group);
[self method1WithCompletion:^(BOOL success){
    dispatch_group_leave(group);
}];

//METHOD 2
dispatch_group_enter(group);
[self method2WithCompletion:^(BOOL success){
    dispatch_group_leave(group);
}];

dispatch_group_notify(group,dispatch_get_main_queue(),^{
    //METHOD 3
});

メソッド 1 を実行するために必要であり、それが完了したらメソッド 2 を実行し、それが完了したら最後にメソッド 3 を実行します (メソッドをキューに入れます)。

各補完でメソッドを連鎖させて次を実行できることはわかっていますが、これにはより良いアプローチがあると思いました...何かアイデアはありますか?

4

2 に答える 2

0

編集済み: 私はもうそうは思いません.cjwirthはコメントで以下の私の仮定に反論しました

シリアルキューでのアプローチはまだあると思います(ただし、あくまで推測で確認はしていません)。主なアイデアは、グループのタスクをシリアル キューdispatch_group_enter(group)にディスパッチし、ディスパッチ前とdispatch_group_leave(group)メソッド 1..2 の完了時に使用することです。それがどうあるべきかを示しましょう:

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_group_t group = dispatch_group_create();

//METHOD 1
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
   [self method1WithCompletion:^(BOOL success){
   dispatch_async(queue, ^{                     
                     dispatch_group_leave(group);
             });
    }];
});

//METHOD 2
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
   [self method2WithCompletion:^(BOOL success){
   dispatch_async(queue, ^{                     
                     dispatch_group_leave(group);
             });
    }];
});

dispatch_group_notify(group,dispatch_get_main_queue(),^{
    //METHOD 3
});

注:この種の実装は、何か問題があるように見えます。NSOperationQueue が既にあるので、NSURLSessionDataTaskのものを NSOperation にラップして、順番に実行することをお勧めします。

于 2015-02-10T17:17:22.353 に答える