2011-07-14 31 views
2

私はGCDを使ってインターネットからバックグラウンドを読み込んでいます。これは小さな欠点を除いて素晴らしい作品です。私のアプリでは3つのタブがあり、いずれかのタブをクリックするとGCDが適切なタブのバックグラウンド読み込みを開始します。ユーザが第1のタブから第2のタブに移動することを決定した場合(GCDが第1のタブのダウンロードデータを開始したとき)、第1のタブに再び戻る。 GCDは別のバックグラウンドスレッドを開始します(最初のバックグラウンドスレッドがまだデータのダウンロードを完了していなくても)。Grand Central Dispatchを使用して、ブロックが既に実行されているかどうかを確認するにはどうすればよいですか?

バックグラウンドスレッドが現在実行中であるかどうかを確認する方法はありますか?ユーザーが何らかの理由でタブを非常に素早く切り替えることを選択した場合、複数のバックグラウンドスレッドを開始しないようにします。

+0

"GCDは別のスレッドを開始します"。実際に私はGCDに別のスレッドを開始するように言っていると思います。スレッドが実行中であることを示すには、何らかのフラグが必要です。ブロックの開始時にtrueに、最後にfalseに設定します。私はブールへの読み書きは本質的であると信じています。 –

答えて

9

同じタイプの2つのブロックが同時に実行されないようにするには、ディスパッチセマフォを使用できます。セマフォが1のカウントに設定されていると、ブロックを起動する前にセマフォをチェックして、何かが実行中であればベールすることができます。ブロックの最後に、セマフォに信号を送り、他のブロックの送信を許可します。

複数のOpenGL ESフレームレンダリングブロックを一度にキューに追加するのを防ぐために、私のアプリケーションの1つでこれを行います(フレームが1/60秒よりも長くかかる場合、キュー内のブロックの蓄積を防ぐレンダリングする)。

if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) 
{ 
    return; 
} 

dispatch_async(openGLESContextQueue, ^{ 

    [EAGLContext setCurrentContext:context]; 

    // Render here 

    dispatch_semaphore_signal(frameRenderingSemaphore); 
}); 

次のようにframeRenderingSemaphoreが以前に作成されます:私は次のコードを使用して、私の答えhereにこの一部を記述

frameRenderingSemaphore = dispatch_semaphore_create(1); 

を使用すると、各タブのダウンロード操作のための同様のセマフォを作成する場合、そのタブの複数のダウンロードが一度にキューに入れられていないことを確認するチェックを行うことができます。

0

あなたが必要とするのは、タスクが完了するまで(GDCをまったく伴わない)タスクを再開するのを避けるための単純なブール型フラグです。サムシング(擬似コード、テストされていない、免責事項、など)のような:

- (void)something_you_run_in_your_view_did_appear 
{ 
    synchronize(self) { 
     if (self.doing_task) 
      return; 
     self.doing_task = YES; 
    } 
    start_your_task_here 
} 

- (void)something_you_run_when_the_task_finishes 
{ 
    synchronize(self) { 
     self.doing_task = NO; 
    } 
} 

この擬似コードは、非同期NSURLConnectionのようなもののために働くだろう。私はまだGDCを調べていませんが、他の人がこれをGDC(あなた自身?)に適応させる必要があります。

この例では、単純な可変アクセスではなくプロパティを使用しています。これにより、アクティビティインジケータのアクティブ化、ユーザインタフェース入力の無効化など、セッターにもっと魅力的なものを実装することができます。というサブクラスでも、親クラスで変数の状態が変更されるとになります。

+1

スレッドセーフではないアクセッサでは何もしないでください。 –

関連する問題