2009-08-27 104 views
1

我需要一個for循環,每個循環之間等待2秒鐘,然後繼續睡眠時間成環

for (int i = 0; i < [stories count]; i++) { 
    //my code 
    //sleep 2 seconds and continue 
} 

我怎樣才能做到這一點?

回答

8
[NSThread sleepForTimeInterval:2.0]; 
1

這裏的問題是,它會阻止用戶界面的2 * [stories count]秒 - 當然足夠長的時間,爲用戶注意到您的應用程序沒有響應,並似乎已被掛起。那很糟。

使用計時器來代替計時器的userInfo中的索引(如果確實需要索引)或NSEnumerator([stores objectEnumerator])。實現你的定時器回調方法只能處理一個對象。如果您正在使用索引,那麼該方法也應該用userInfo替換下一個索引。它的最後一步是檢查你是否已經耗盡了物品,如果是,請調用你無效並釋放計時器的方法(你也應該從dealloc中調用)。

對於這個問題,我質疑爲什麼你需要等待兩秒之間的操作。如果您正在等待某些事情發生,那麼您應該等待,並在必要時等待更長時間,而不是在兩次操作之間對固定的兩秒間隔進行硬編碼。

2

Peter Hosey關於阻止UI線程(通常稱爲主線程)是正確的。但我認爲他的解決方案是錯綜複雜的。

簡單的解決方案1:調用其中長阻擋環是上使用後臺線程的方法,包括:

[self performSelectorInBackground:@selector(longRunningMethod) 
         withObject:nil]; 

簡單的解決方案2:添加其中長阻擋環是一個NSOperationsQueue的方法:

NSOperationQueue* oq = [[NSOperationQueue new] autorelease]; 
NSOperation* o = [[NSInvocationOperation alloc] initWithTarget:self 
                 selector:@selector(longRunningMethod) 
                 object:nil] 
[oq addOperation:o]; 
[o release]; 

在後臺啓動選擇器比較容易,幾乎太簡單了,因爲如果用於瘋狂的話,它們會耗盡資源。

使用NSOperationQueue需要幾行設置,但作爲獎勵它重新使用線程,並應用其他優化以使用更少的資源。顧名思義,它也可以用於排隊操作。您可以指定並行操作的最大數量和不同的約束。