我有一個程序,從網上下載噸文件如何確保某些代碼每隔1秒不會超過1次?
我有幾個線程下載數據。
每個數據被調用後,我需要更新管理對象上下文
如果10個線程完成加載大約在同一時間,然後被管理對象上下文將獲得運行10次。
事實是我只需要運行一次。
我想要做的是創建一個接受塊的方法。
我該如何做一個接收塊的函數,但是如果該塊已經運行不到1秒鐘,它將不會運行該塊,而是會推遲第二次運行,直到1秒,無論如何通常這個函數被調用。
我有一個程序,從網上下載噸文件如何確保某些代碼每隔1秒不會超過1次?
我有幾個線程下載數據。
每個數據被調用後,我需要更新管理對象上下文
如果10個線程完成加載大約在同一時間,然後被管理對象上下文將獲得運行10次。
事實是我只需要運行一次。
我想要做的是創建一個接受塊的方法。
我該如何做一個接收塊的函數,但是如果該塊已經運行不到1秒鐘,它將不會運行該塊,而是會推遲第二次運行,直到1秒,無論如何通常這個函數被調用。
Mike Ash已經爲此執行了timer class。
你需要用行爲類型來初始化它,取決於具體的行爲,你想:
MABGTimerDelay
意味着每次調用afterDelay:1.0 do:^{ /*code*/ }
以便它只被運行完整它將集火追溯到時間第二次在末尾打電話。MABGTimerCoalesce
意味着每當您撥打afterDelay:1.0 do:^{ /*code*/ }
時,它都會設置啓用日期,以便在第一次呼叫後僅運行整整一秒。如果它已經運行,這兩種行爲都將允許您再次運行它,但只有在延遲再次通過後。
如果運行的程序塊總是相同的,那麼可以讓循環運行一秒鐘的時間間隔來檢查布爾值,並且只在布爾值爲YES時才執行該程序段。事情是這樣的:
BOOL needsUpdate;
-(void) loop {
if (needsUpdate) {
//Run Block
needsUpdate = NO;
}
[self performSelector:@selector(loop) withObject:nil afterDelay:1.0];
}
當線程完成加載,您只需設置needsUpdate = YES
和環路採用其餘的工作。
當一個線程完成調用主線程中的方法。在該方法中,製作一個延遲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是一個實例變量。