2011-09-15 7 views
1

私は、ネットからたくさんのファイルをダウンロードするプログラムを持っています。特定のコードが1秒に1回以上実行されないようにするにはどうすればよいですか?

私はいくつかのスレッドでデータをダウンロードしています。

各データが呼び出された後、私は、管理対象オブジェクトは、10件のスレッドがほぼ同時にロードを完了した場合、管理対象オブジェクトコンテキストは10回実行取得します

コンテキスト更新する必要があります。

真実私は一度だけ実行する必要があります。

私がしたいことは、ブロックを受け入れるメソッドを作成することです。

ブロックを受信する関数を作成するにはどうすればよいですか?そのブロックが1秒未満で実行された場合、ブロックは実行されず、代わりに1秒間の2回目の実行が延期されます多くの場合、関数が呼び出されます。

答えて

2

マイク・アッシュはすでにtimer classを実装しています。

あなたが望む正確な動作に応じて、行動の種類でそれを初期化する必要があります。

  • MABGTimerDelayは、あなたはそれが唯一のフルを実行しますように、それが逆火日付を設定しますafterDelay:1.0 do:^{ /*code*/ }呼び出すたびに意味の後に2番目にが呼び出されます。
  • MABGTimerCoalesceは、afterDelay:1.0 do:^{ /*code*/ }に電話するたびに、の最初のコールの後に1秒しか実行されないように、発信日を戻します。

既に実行されている場合は、両方の動作で遅延を再実行した後でのみ、再度動作させることができます。

1

実行されるブロックが常に同じ場合、ブール値をチェックし、ブール値がYESの場合にのみブロックを実行するループを1秒間隔で実行できます。このような何か:

BOOL needsUpdate; 
    -(void) loop { 
    if (needsUpdate) { 
     //Run Block 
     needsUpdate = NO; 
    } 
    [self performSelector:@selector(loop) withObject:nil afterDelay:1.0]; 
    } 

のスレッドが読み込みが終了すると、あなただけのneedsUpdate = YESを設定し、ループは、残りの世話をします。

1

スレッドがメインスレッドのメソッドを終了したとき。その方法では、1秒遅れのタイマーを作る。

- (void)threadDidFinish 
{ 
    if (_saveTimer != nil) 
    { 
     _saveTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(saveTimerDidFire) userInfo:nil repeats:NO]; 
    } 
} 

- (void)saveTimerDidFire 
{ 
    [_saveTimer invalidate]; 
    _saveTimer = nil; 

    // save the changes 
} 

このコードを使用すると、関係なく、呼ばれたthreadDidFinish回数の秒ごとに保存されます保証されます。 NSTimer * _saveTimerはインスタンス変数です。

関連する問題