4

最初のメソッドが完了したら、要件に従って非同期でメソッドを処理しようとしています。その後、2 番目のメソッドの実行が開始されます。問題は、最初のメソッド自体にバックグラウンド スレッドで実行されるコードがあることです。

dispatch_semaphore_wait を試しましたが、うまくいきませんでした。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

        dispatch_group_t group = dispatch_group_create();


        dispatch_group_async(group, queue, ^{

            [self firstMethod];
            NSLog(@"firstMethod Done");

        });
        dispatch_group_notify(group, queue, ^ {

            NSLog(@"1st method completed");
            NSLog(@"2nd method starting");

            [self secondMethod];

        });

FirstMethod 自体は、このように別のワーカー スレッドで実行されます

-(void)firstMethod
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
   //processing here.....       

 }];

それを達成するための最良の方法は何ですか。サードパーティによって提供されているため、firstMethodの定義を変更することはできません。また、変更すると、このメソッドが呼び出されている場所から多くの既存のコードを変更することになります

4

2 に答える 2

12

完了ブロックを使用できます。firstMethod を次のように変更するだけです。

- (void)firstMethodWithOnComplete:(void (^)(void))onComplete {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
          //processing here.....
          onComplete();
       });
}    

そして、次のように使用します。

[self firstMethodWithOnComplete:^{
    [self secondMethod];
}];
于 2013-05-09T22:31:04.927 に答える