2011-09-15 34 views
1

我有一個程序,從網上下載噸文件如何確保某些代碼每隔1秒不會超過1次?

我有幾個線程下載數據。

每個數據被調用後,我需要更新管理對象上下文

如果10個線程完成加載大約在同一時間,然後被管理對象上下文將獲得運行10次。

事實是我只需要運行一次。

我想要做的是創建一個接受塊的方法。

我該如何做一個接收塊的函數,但是如果該塊已經運行不到1秒鐘,它將不會運行該塊,而是會推遲第二次運行,直到1秒,無論如何通常這個函數被調用。

回答

2

Mike Ash已經爲此執行了timer class

你需要用行爲類型來初始化它,取決於具體的行爲,你想:

  • MABGTimerDelay意味着每次調用afterDelay:1.0 do:^{ /*code*/ }以便它只被運行完整它將集火追溯到時間第二次在末尾打電話。
  • MABGTimerCoalesce意味着每當您撥打afterDelay:1.0 do:^{ /*code*/ }時,它都會設置啓用日期,以便在第一次呼叫後僅運行整整一秒。

如果它已經運行,這兩種行爲都將允許您再次運行它,但只有在延遲再次通過後。

1

如果運行的程序塊總是相同的,那麼可以讓循環運行一秒鐘的時間間隔來檢查布爾值,並且只在布爾值爲YES時才執行該程序段。事情是這樣的:

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是一個實例變量。

相關問題