繁体   English   中英

iPhone - NSTimer 在火灾后不重复

[英]iPhone - NSTimer not repeating after fire

我正在创建和触发一个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;

出于某种原因,计时器没有重复。 它只发射一次,以后再也不会发射。

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

明白了

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

干得好:

目标 C:

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

斯威夫特 2

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

斯威夫特 3、4、5

var ncTimer = Timer(timeInterval: 2.0, target: self, selector: #selector(self.handleTimer), userInfo: nil, repeats: true)
RunLoop.main.add(ncTimer, forMode: RunLoop.Mode.default)

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

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

另外:fire 方法会不循环地触发计时器。 如果计时器不重复,则它无效。 在说 fire 的那一行之后,添加:


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

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

因此,代码将保留:

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

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

假设声明在成员对象中,您需要执行以下操作:

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

我不知道为什么但 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)

您可以通过以下方式在Swift 中编写相同的内容而无需在主循环中运行:

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

带闭包的 Swift 计时器:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM