iPhone - NSTimer在火灾后不再重复

时间:2011-01-23 11:31:39

标签: iphone nstimer

我正在使用:

创建并触发NSTimer
ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                           target:self
                                         selector:@selector(handleTimer:)
                                         userInfo:nil
                                          repeats:YES];
[ncTimer fire];

- (void)handleTimer:(NSTimer *)chkTimer {
    // do stuff
}

我保留我的计时器:

@property (nonatomic, retain) NSTimer *ncTimer;

由于某种原因,计时器不会重复。它只发射一次而不是再发射一次。

8 个答案:

答案 0 :(得分:38)

-fire:方法手动触发一次。要启动和重复计时器,您必须使用[[NSRunLoop currentRunLoop] addTimer: forMode:]

将其添加到runloop

答案 1 :(得分:22)

搞定了

mainRunLoop添加计时器使其正常工作

你走了:

目标C:

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

夫特:

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode)

答案 2 :(得分:7)

您不能只将分配给已作为属性放入标题的计时器。这应该有效:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

另外:fire方法触发定时器,不在循环中。如果计时器不重复,则无效。在说出火线后,添加:


BOOL timerState = [ncTimer isValid];
NSLog(@"Timer Validity is: %@", timerState?@"YES":@"NO");

答案 3 :(得分:6)

您也可以在此块中复制代码,该代码在主线程中插入Timer的创建。

因此代码将保留:

dispatch_async(dispatch_get_main_queue(), ^{
  self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                 target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
});

答案 4 :(得分:3)

分配给ncTimer不会启动属性retain功能。

假设声明在成员对象中,您需要这样做:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]

答案 5 :(得分:1)

您可以在 Swift 中编写相同的内容,而无需在主循环中运行,方法是:

ncTimer = Timer.scheduledTimer(timeInterval: 1.0, 
                               target: self, 
                               selector: #selector(self.handleTimer), 
                               userInfo: nil, 
                               repeats: true)
ncTimer.fire()

答案 6 :(得分:0)

我不知道为什么,但是Timer.scheduledTimer方法不起作用,但是Timer.init方法起作用。

self.timer = Timer.init(timeInterval: 10.0, repeats: true, block: { (timer) in
            print("\n--------------------TIMER FIRED--------------\n")
            self.checkForDownload()
        })
RunLoop.main.add(self.timer!, forMode: RunLoopMode.defaultRunLoopMode)

答案 7 :(得分:0)

带关闭功能的快速计时器

    let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
         // Do whatever
    }
    timer.fire()