self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerDisplay) userInfo:nil repeats:YES];
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
此代码片段是从我的viewDidLoad方法复制的,因此它是从主线程运行的。它所做的就是调用一个方法来更新标签。
我认为我需要有一个自己的线程来做这件事,但在得到这方面的帮助之后,我发现我没有。
但是,我不理解NSRunLoopCommonModes
。它为什么有效?
AND计时器更新标签,这是一个“数字计数器”,与桌面视图位于同一屏幕上,因此即使用户握住屏幕也无法停止计时器。
感谢。
答案 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函数中添加上面的代码,当事情完成后,线程就会死掉,并且线程的自动释放池将被释放。