2011-02-10 140 views
0
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerDisplay) userInfo:nil repeats:YES]; 
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; 

該代碼片段從我的viewDidLoad方法中複製,因此它從主線程運行。它所做的只是調用一個方法來更新標籤。NSTimer更新標籤

我以爲我需要有一個自己的線程來做到這一點,但在得到這個幫助後,我發現我沒有。我不明白NSRunLoopCommonModes。它爲什麼有效?


和計時器更新標籤這是一個「數字計數器」,這是在同一個屏幕作爲的tableview上,因此它不能停止計時器,即使用戶持有的屏幕。

謝謝。

回答

2

NSRunLoop可以運行在不同的輸入模式。該模式定義了當前runloop處理哪些事件。
例如:如果當前的runloop處於事件跟蹤模式,它只處理模態事件循環。 (例如,在Mac上拖動NSScrollBar或NSSlider)

如果僅爲NSDefaultRunLoopMode添加NSTimer,則它將不會在引發模態事件循環的情況下觸發。 (在Apple's documentation詳細信息)

NSRunLoopCommonModes是用於多種模式的「別名」,這樣你就不必做:

[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSDefaultRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSModalPanelRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSEventTrackingRunLoopMode]; 
0

我不認爲你必須有這條線,第一行就足夠了......我在我的代碼中使用PSYBlockTimer,它來自您使用的SDK方法,但不是選擇器調用塊:

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:NO usingBlock:^ (NSTimer *t) 
{ 
    // stuff that will get executed in a second 
}]; 
0

如果你在另一個線程添加您的時間NSRunLoop的實例,你這個線程的NSRunLoop需要一個while循環。它看起來像如下:

do { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; 
} while (bDone); 

通常情況下,我加上我的線程的主要功能上面的代碼,當事情完成後,該線程死吧和線程的自動釋放池將被釋放。