2011-12-08 2 views
1

私は1つのメイングループを実行し、別のスレッドで別の2つのバックグラウンドタスクを実行し、待機してから、以下に示す一般ブロックで変更された値を返すサンプル関数を次に示します。以下に示すのは、これを行う方法の私の推測です。これらのブロックをすべて1つのブロックで実行すると機能します。ブロックを分割すると失敗します。誰かが同様のことを達成する方法の例を持っていますか?あなたの助けを前にありがとう。グランドセントラルディスパッチ。 1つの非同期グループを実行し、待機してから別のグループを実行し、もう一度待機してから終了しますか?

-(NSString *)sampleFunction:(NSString*)inputString 
{ 
__block NSString *returnString; 

dispatch_group_t mainGroup = dispatch_group_create(); 
dispatch_group_t otherGroup = dispatch_group_create(); 

void (^firstBlock)(void) = ^(void) 
{ 
    ... 
}; 

void (^secondBlock)(void) = ^(void) 
{ 
    ... 
}; 


void (^thirdBlock)(void) = ^(void) 
{ 
    ... 
}; 

dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock); 

dispatch_group_wait(oneGroup, sizeof(int)); 

dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock); 
dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock); 

dispatch_group_wait(otherGroup, sizeof(int)); 

dispatch_release(userGroup); 
dispatch_release(otherGroup); 

return returnString; 
} 
+1

大きな画像を説明してください。何を達成しようとしていますか?私は待っている部分を取得しません。 – DarkDust

+1

そしてなぜ 'sizeof(int)'を 'dispatch_group_wait'に引数として渡していますか?あなたは 'DISPATCH_TIME_FOREVER'を知っていますか? – DarkDust

+1

なぜ、1つのスレッドですべてのコードを実行するだけではないのですか?スレッドが完了するのを待っている場合は、スレッドを持っていても何がポイントですか? –

答えて

4

これを行うにはさまざまな方法がありますが、最も概念的に単純な(または少なくとも明白な)方法は、 "パイプライン"の各段階のグループを作成し、グループAのスケジュールの完了コールバックグループBの仕事もグループCの仕事をスケジュールする完了コールバックを持っています。

ここのキーは、グループが完了するのを実際に「待つ」ことではありません。グループには、そのグループの最後のブロックが終了したときに自動的に実行される完了ブロックがあります(dispatch_group_notify()を参照)。これは、「ファンイン」ポイントを作成する良い方法です。グループ。

7

dispatch_semaphoreはここにあなたの友人です。あなたも簡単な解決策が必要な場合はあなたがあなたのグループを使用しているかを正確に確認されていないが:-)

/* Create your semaphore with 0 */ 
dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

/* wait on the semaphore, causes your second & third queue to wait */ 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

/* At the end of your first queue finishing, signal the semaphore waiting in 
    the 2nd queue to take over */ 
dispatch_semaphore_signal(sema); 

は、単に、これらのグループの代わりに(それはあなたのためのセマフォの作業を行います)dispatch_applyを使用します。

+0

速い返答をありがとう。私はすぐにこれを試し、あなたが成功したときに投票して正解を返すようにします:) – banDedo

関連する問題