NSTimer更新标签

时间:2011-02-10 09:55:55

标签: iphone

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerDisplay) userInfo:nil repeats:YES];
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];

此代码片段是从我的viewDidLoad方法复制的,因此它是从主线程运行的。它所做的就是调用一个方法来更新标签。

我认为我需要有一个自己的线程来做这件事,但在得到这方面的帮助之后,我发现我没有。

但是,我不理解NSRunLoopCommonModes。它为什么有效?


AND计时器更新标签,这是一个“数字计数器”,与桌面视图位于同一屏幕上,因此即使用户握住屏幕也无法停止计时器。

感谢。

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

我认为你根本不需要这一行,第一行就够了......我在我的代码中使用了PSYBlockTimer,它来自你使用的SDK方法,而不是选择器调用一个街区:

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

答案 2 :(得分:0)

如果您将时间添加到另一个线程下的NSRunLoop实例,则需要一个针对该线程的NSRunLoop的while循环。它看起来如下:

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

通常,我在我的线程main函数中添加上面的代码,当事情完成后,线程就会死掉,并且线程的自动释放池将被释放。