iPhone - NSTimer在火灾后不再重复

Zig*_*rth 11 iphone nstimer

我正在创建并解雇NSTimer:

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                           target:self
                                         selector:@selector(handleTimer:)
                                         userInfo:nil
                                          repeats:YES];
[ncTimer fire];
Run Code Online (Sandbox Code Playgroud)

- (void)handleTimer:(NSTimer *)chkTimer {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我保留我的计时器:

@property (nonatomic, retain) NSTimer *ncTimer;
Run Code Online (Sandbox Code Playgroud)

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

Wal*_*ter 38

-fire:方法手动触发一次.要启动和重复计时器,您必须使用它将其添加到runloop[[NSRunLoop currentRunLoop] addTimer: forMode:]

  • 这是正确的,但使用`NSTimer``servageTimerWith ...`方法而不是手动添加到运行循环更简单. (15认同)

Vai*_*ran 23

得到它了

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

干得好:

目标C:

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

迅速:

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

  • 我也是,这对我有用,但 `scheduleTimerWithTimeInterval` 没有 (2认同)
  • 在 swift 4: `RunLoop.main.add(timer, forMode: RunLoopMode.defaultRunLoopMode)` (2认同)

Aur*_*ila 7

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

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

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


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

  • 好的我发现了问题.我在一个单独的线程中从另一个类调用的方法中启动计时器,该方法不允许计时器重复. (6认同)

Dan*_*rez 6

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

因此代码将保留:

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