我需要一個for循環,每個循環之間等待2秒鐘,然後繼續睡眠時間成環
for (int i = 0; i < [stories count]; i++) {
//my code
//sleep 2 seconds and continue
}
我怎樣才能做到這一點?
我需要一個for循環,每個循環之間等待2秒鐘,然後繼續睡眠時間成環
for (int i = 0; i < [stories count]; i++) {
//my code
//sleep 2 seconds and continue
}
我怎樣才能做到這一點?
[NSThread sleepForTimeInterval:2.0];
這裏的問題是,它會阻止用戶界面的2 * [stories count]
秒 - 當然足夠長的時間,爲用戶注意到您的應用程序沒有響應,並似乎已被掛起。那很糟。
使用計時器來代替計時器的userInfo
中的索引(如果確實需要索引)或NSEnumerator([stores objectEnumerator]
)。實現你的定時器回調方法只能處理一個對象。如果您正在使用索引,那麼該方法也應該用userInfo
替換下一個索引。它的最後一步是檢查你是否已經耗盡了物品,如果是,請調用你無效並釋放計時器的方法(你也應該從dealloc
中調用)。
對於這個問題,我質疑爲什麼你需要等待兩秒之間的操作。如果您正在等待某些事情發生,那麼您應該等待,並在必要時等待更長時間,而不是在兩次操作之間對固定的兩秒間隔進行硬編碼。
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需要幾行設置,但作爲獎勵它重新使用線程,並應用其他優化以使用更少的資源。顧名思義,它也可以用於排隊操作。您可以指定並行操作的最大數量和不同的約束。