Iphone NSTimer更新标签

Iphone NSTimer更新标签,iphone,Iphone,此代码段是从viewDidLoad方法复制的,因此它是从主线程运行的。它所做的只是调用一个方法来更新标签 我想我需要有一个自己的线程来做这件事,但在得到帮助后,我发现我没有 但是,我不理解NSRunLoopCommonModes。它为什么有效 计时器会更新标签,即“数字计数器”,它与tableview位于同一屏幕上,因此即使用户握住屏幕,它也无法停止计时器 谢谢。我想你根本不需要这一行,第一行就足够了。。。我在代码中使用的是从您使用的SDK方法派生的,但不是选择器调用块: self.timer

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

我想我需要有一个自己的线程来做这件事,但在得到帮助后,我发现我没有

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


计时器会更新标签,即“数字计数器”,它与tableview位于同一屏幕上,因此即使用户握住屏幕,它也无法停止计时器


谢谢。

我想你根本不需要这一行,第一行就足够了。。。我在代码中使用的是从您使用的SDK方法派生的,但不是选择器调用块:

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

NSRunLoop可以在不同的输入模式下运行。模式定义当前运行循环处理的事件。
e、 g:如果当前运行循环处于事件跟踪模式,则它仅处理模式事件循环。(例如,在Mac上拖动NSScrollBar或NSSlider)

如果仅为NSDefaultRunLoopMode添加NSTimer,则在出现模式事件循环时不会触发。(详情请参阅)

nsrunlopCommonModes是多种模式的“别名”,因此您无需执行以下操作:

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

如果将时间添加到另一个线程下的nsrunlop实例,则该线程的此nsrunlop需要一个while循环。如下所示:

[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSModalPanelRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSEventTrackingRunLoopMode];
通常,我会在我的线程主函数中添加上面的代码,当事情完成时,线程将死亡,线程的自动释放池将被释放

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